情况描述:
公司有一个程序,要去访问其它公司的程序的Dll(我们知道他们的具体路径,其它公司的dll)
我们的程序是C#写的,我们要调用他们中的一个dll中的一个方法(这个dll是C#写的),他们这个 dll又依赖了另外一个C++的dll(这个Dll 我们不使用)
问题:我如何加载他们的dll ,我用Assembly.LoadFrom加载我们要用的dll时候,发出异常,异常信息就是无法找到C++的dll 请大家多帮助,谢谢
我采用的方法:先加载C++的这个dll,在加载我们要用的Dll,但如何加载C++的这个dll
目前不知道怎么做?谢谢
尝试下在App.config 中指定C++ dll 的路径。
在应用程序运行的时候,会检查当前程序运行的目录有无所需要的dll文件,如果找不到,就会查找APP.Config配置文件中所配置的目录
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin\B"/>
</assemblyBinding>
</runtime>
</configuration>
这个只使用于Dll在自己的目录中,或Dll是强命名的,他们C#的Dll不是强命名的,因此这种方法也不行
C++的dll与C#的dll在同一个文件夹中吗?
是的,他们公司只提供一个他们的安装目录,要我们的程序去读取他们的dll来进行操作,现在我可以用C#来加载那个C#的Dll但依赖的那个C++不知道怎么处理,他们也不让dll拷贝到我们的bin目录中,也不允许设置环境变量
那个c++是他们核心的算法,他们提供了一个C#包装的dll,我们只需要调用这个C#的dll
c#加载c++的dll,需要用到DllImport这个attribute,找点资料看看吧。
既然人家那个C#的dll需要C++的dll,你肯定那个C++的dll也得有啊?要不人家那个C#的dll怎么运行?
他们提供的方式,只是让我们去读取他们目录中的dll,这个好像出现跨域操作了,我们使用他们的api根本不用关系它的C++的
只是他们C#的依赖了一个C++的,我们不能不知道他们C++中有哪些方法,因此DllImport这个东西没法用
///<summary>
/// 获取DllImportAttribute特性引入的非托管程序集
///</summary>
///<param name="filePath">程序集路径</param>
///<returns></returns>
public List<string> GetUnmanagedAssemblies(string filePath)
{
List<string> unmanagedAssembliesList = new List<string>();
try
{
Assembly asm = assemblyManager.GetAssembly(filePath);
foreach (Type t in asm.GetTypes())
{
foreach (MethodInfo mi in t.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
{
foreach (object obj in mi.GetCustomAttributes(false))
{
if (obj is DllImportAttribute)
{
string value = ((DllImportAttribute)obj).Value;
if (unmanagedAssembliesList.Contains(value))
{
continue;
}
unmanagedAssembliesList.Add(value);
}
}
}
}
return unmanagedAssembliesList;
}
catch (ReflectionTypeLoadException ex)
{
List<string> exceptionList = new List<string>();
foreach (Exception inner in ex.LoaderExceptions)
{
if (exceptionList.Contains(inner.Message))
{
continue;
}
MessageBox.Show("Method GetUnmanagedAssemblies: " + inner.Message, @"ReflectionTypeLoadException");
}
return null;
}
catch(Exception ex)
{
MessageBox.Show("Method GetUnmanagedAssemblies: " + ex.Message);
return null;
}
}
这个可以获取到非托管代码,但如何将获取到的这些托管代码加载到内存中呢?谢谢
List<string> lt = GetUnmanagedAssemblies(@"C:/Program Files/Citisafe/BIN/CitiSafe.dll");
foreach (string str in lt)
{
Console.WriteLine(str);
}
C#可以用将CitiSafe.dll加载到内存中,但无法将这个路径下的c++ dll加载到内存中,这就造成了反射调用c# dll出问题,无法找到C++ dll
这个问题好复杂啊.
反编译它的 托管代码,看他是怎么调用 C++ 代码的。
然后 跨过 他们的 包装 直接 DllImport C++ 的。