运行同一个非托管dll的两个版本(由C#应用程序引用)



背景

我有两个用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"theDell.dll"密钥

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

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

  • 请供应商提供强名称版本

这导致了一个"嗯?"。dll工作得很好,但是,所以我不想寻找一个新的供应商,如果我不真的必须。

  • 使用ildasm为dll指定一个强名称:

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

错误:"Dell.dll"没有有效的CLR标头,无法分解

这似乎意味着dll是非托管的,因此不可能进行强命名(如果我没有弄错的话(。

  • 使用SetDllDirectory和LoadLibrary加载dll的正确版本
    这似乎有点奏效,至少我可以在不注册的情况下从指定的地方加载正确的dll。不过,这似乎是一种相当复杂的方法

问题

  • 有没有人用"LoadLibrary"的方式做到了这一点,并且可以验证它是否适用于需要实例化某些类的dll?

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

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

有几点我觉得没有涵盖,所以我很容易理解:

  • Oleviview.exe是获取清单所需信息的一种方法。可以使用Object classes->All objects(前提是已在regsvr32中注册(或使用File->View TypeLib来查找dll。在我掌握所有信息之前,我觉得这两个都是必要的(它们显示的信息不同(。

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

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

最新更新