首页 新闻 会员 周边

C# 加载Dll问题

0
悬赏园豆:100 [已解决问题] 解决于 2012-04-18 10:35

情况描述:

公司有一个程序,要去访问其它公司的程序的Dll(我们知道他们的具体路径,其它公司的dll)

我们的程序是C#写的,我们要调用他们中的一个dll中的一个方法(这个dll是C#写的),他们这个 dll又依赖了另外一个C++的dll(这个Dll 我们不使用)

问题:我如何加载他们的dll ,我用Assembly.LoadFrom加载我们要用的dll时候,发出异常,异常信息就是无法找到C++的dll 请大家多帮助,谢谢

我采用的方法:先加载C++的这个dll,在加载我们要用的Dll,但如何加载C++的这个dll

目前不知道怎么做?谢谢

永不满足的主页 永不满足 | 初学一级 | 园豆:13
提问于:2011-09-22 16:05
< >
分享
最佳答案
0

尝试下在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>  

收获园豆:20
赵保龙 | 菜鸟二级 |园豆:249 | 2011-09-23 11:13

这个只使用于Dll在自己的目录中,或Dll是强命名的,他们C#的Dll不是强命名的,因此这种方法也不行

永不满足 | 园豆:13 (初学一级) | 2011-09-23 17:04
其他回答(6)
0

C++的dll与C#的dll在同一个文件夹中吗?

dudu | 园豆:31007 (高人七级) | 2011-09-22 17:26

是的,他们公司只提供一个他们的安装目录,要我们的程序去读取他们的dll来进行操作,现在我可以用C#来加载那个C#的Dll但依赖的那个C++不知道怎么处理,他们也不让dll拷贝到我们的bin目录中,也不允许设置环境变量

支持(0) 反对(0) 永不满足 | 园豆:13 (初学一级) | 2011-09-22 17:38

那个c++是他们核心的算法,他们提供了一个C#包装的dll,我们只需要调用这个C#的dll

支持(0) 反对(0) 永不满足 | 园豆:13 (初学一级) | 2011-09-22 17:39
0

c#加载c++的dll,需要用到DllImport这个attribute,找点资料看看吧。

Virus-BeautyCode | 园豆:1619 (小虾三级) | 2011-09-22 18:51
0

既然人家那个C#的dll需要C++的dll,你肯定那个C++的dll也得有啊?要不人家那个C#的dll怎么运行?

收获园豆:20
顾晓北 | 园豆:10844 (专家六级) | 2011-09-23 11:11

他们提供的方式,只是让我们去读取他们目录中的dll,这个好像出现跨域操作了,我们使用他们的api根本不用关系它的C++的

只是他们C#的依赖了一个C++的,我们不能不知道他们C++中有哪些方法,因此DllImport这个东西没法用

支持(0) 反对(0) 永不满足 | 园豆:13 (初学一级) | 2011-09-23 17:03
0
///<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;
}
}
收获园豆:20
lexiaoyao20 | 园豆:225 (菜鸟二级) | 2011-09-24 09:08

这个可以获取到非托管代码,但如何将获取到的这些托管代码加载到内存中呢?谢谢

支持(0) 反对(0) 永不满足 | 园豆:13 (初学一级) | 2011-09-24 10:45

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

支持(0) 反对(0) 永不满足 | 园豆:13 (初学一级) | 2011-09-24 10:47
2

 

这个问题好复杂啊.

收获园豆:20
通用C#系统架构 | 园豆:704 (小虾三级) | 2011-09-25 13:51
0

反编译它的 托管代码,看他是怎么调用 C++ 代码的。

然后 跨过 他们的 包装 直接 DllImport C++ 的。

收获园豆:20
waninlezu | 园豆:661 (小虾三级) | 2011-09-27 12:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册