首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用.net dll +非托管dll

引用.net dll +非托管dll
EN

Stack Overflow用户
提问于 2012-04-12 08:38:13
回答 4查看 1.9K关注 0票数 0

我有一个项目(称为平台),它引用一个.net dll (称为call proxy),该项目使用DllImport (称为仪器)引用C++ dll。仪器和它的代理总是相同的版本,并且总是作为一个整体来部署。

我需要能够在一台机器上部署多个仪器(及其代理),而只有一个平台使用该仪器的特定版本。

似乎我无法将一个实例代理放置到GAC,因为它使用C++ DLL。我可以将一个仪器(和它的代理)安装到一个特定的文件夹中,但是我如何确保这个平台能够找到那个dll呢?

Upd.

理论上我希望看到的想法是,在开发时引用这个dll作为正常,但是能够让我的应用程序在自定义文件夹中搜索这个dll。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-12 10:11:16

对于.Net程序集,您可以订阅AppDomain.AssemblyResolve并在需要时使用Assembly.LoadFrom加载程序集(参见https://stackoverflow.com/a/10120664/143503)。

票数 1
EN

Stack Overflow用户

发布于 2012-04-12 09:13:24

将它们保存在单独的文件夹中是可以的。您将使用Assembly.LoadFrom加载正确的工具-代理程序集。然后使用反射从该程序集创建类的实例并进行调用:

代码语言:javascript
复制
Assembly assm = Assembly.LoadFrom("c:\\Versions\\Version01\\instrument-proxy.dll");
Type yourClassType = assm.GetType("YourClass");
object yourClassObj = Activator.CreateInstance(yourClassType);
object Result = yourClassType.InvokeMember("DoSomething",
                                            BindingFlags.Default | BindingFlags.InvokeMethod,
                                            null,
                                            yourClassObj,
                                            args);

为了避免反射调用InvokeMember,您可以尝试使用接口:

代码语言:javascript
复制
Assembly assm = Assembly.LoadFrom("c:\\Versions\\Version01\\instrument-proxy.dll");
Type yourClassType = assm.GetType("YourClass");
YourInterface interf = (YourInterface)Activator.CreateInstance(yourClassType);
interf.DoSomething();

接口需要在一个独立的程序集中,您可以从platform中引用该程序集。所有instrument-proxies都必须针对同一版本的接口程序集进行编译。

如果您的设备代理找不到非托管Instrument.dll,您可以在第一次使用之前显式地加载它:

代码语言:javascript
复制
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);

IntPtr pDll = LoadLibrary(@"PathTo_Instrument.dll");

完成后释放/卸载:

代码语言:javascript
复制
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
票数 2
EN

Stack Overflow用户

发布于 2012-04-12 09:09:22

可以将非托管dll文件复制到文件夹中,然后将该文件夹添加到系统路径变量中,也可以将这些文件复制到Windows\ System 32,因为该文件夹始终位于系统路径中。

若要修改系统路径,请右键单击“我的计算机的属性”“预置系统设置”下的“预置”选项卡“环境变量”下的“系统设置”,您需要找到路径变量,然后修改该变量以包含您的文件。

但是,将文件复制到Windows\System32 32或%systemroot% (C:\Windows通常比较容易),但我建议使用路径变量修改的方法

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10120118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档