运行相同非托管dll的两个版本(由C#-app引用)

时间:2015-10-09 07:15:23

标签: c# .net windows dll

背景

我有两个用C#编写的软件,使用相同的第三方dll来获取电话功能。

问题

当我部署其中一个软件的新版本时,我还部署了新版本的dll。这个覆盖旧dll的引用,导致我的其他软件停止工作,因为新的dll不向后兼容。

尝试解决方案

  • 使用免注册版本的dll部署新软件 这不起作用,因为dll没有强名称。来自sn的结果:
  

C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools> sn.exe -e" theDll.dll"键

     

Microsoft(R).NET Framework强名称实用程序,版本4.0.30319.17929   版权所有(c)Microsoft Corporation。保留所有权利。

     

theDll.dll不代表强名称程序集

  • 询问供应商的强名称版本

这导致了一个"呵呵?"。这个dll运行良好,所以如果我不真的必须,我不想寻找新的供应商。

  • 使用ildasm:
  • 为dll命名
  

C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools> ildasm.exe" theDll.dll" /out=theDll.il

     

错误:' theDll.dll'没有有效的CLR标题,不能被反汇编

这似乎暗示dll是不受管理的,因此无法强烈命名(如果我没有弄错的话)。

  • 使用SetDllDirectory和LoadLibrary加载正确版本的dll 这似乎有点工作,至少我可以从指定的地方加载正确的DLL而无需注册它。这似乎是一种相当复杂的方式。

问题

  • 有没有人这样做了#34; LoadLibrary" -way并且可以验证它是否适用于需要实例化某些类的DLL?

  • 有没有人有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

该指令告诉我如何为非托管COM构建适当的清单文件:https://msdn.microsoft.com/en-us/library/ms973913.aspx

一些重要的观点我不觉得它们被覆盖,所以我很容易理解:

  • Oleview.exe是获取清单所需信息的一种方法。可以使用 Object classes->找到你的dll。所有对象(假设它已通过regsvr32注册)或使用 File->查看TypeLib 。在我获得所有信息之前,我觉得这些都是必需的(它们显示不同的信息)。

  • 当您拥有清单文件时,只需在Visual Studio中选择“添加引用”,选择“浏览”标签,然后选择您创建的COM清单即可。之后,编程就像COM已经注册一样。 VS将为您的程序创建清单。

  • 当然,您需要确保您的安装项目将.dll及其清单部署到与.exe相同的文件夹中。