繁体   English   中英

C#程序如何使用任何版本的COM dll?

[英]How can a C# program use a COM dll of any version?

这个问题是续集这个问题

我们正在创建一个用C ++编写的dll,以提供对某些硬件的访问。 该dll实现并使用COM接口访问。 我们也有一个C#程序,该程序通过COM对象使用此dll。

我们的版本有问题。 确实,在运行C#程序时,它绝对希望使用编译时使用的确切COM / C ++ dll版本。 即,如果C#程序是使用COM / C ++ dll 1.2.3.4编译的,则该程序将拒绝与COM / C ++ dll 1.2.3.5一起运行。

Unhandled Exception: System.TypeInitializationException: The type initializer for 'MyDllVerify.App' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'MyCorp.MyDll.Interop, Version=1.2.3.4, Culture
=neutral, PublicKeyToken=ced78d295d1e0f2b' or one of its dependencies. The system cannot find the file specified.
File name: 'MyCorp.MyDll.Interop, Version=1.2.3.4, Culture=neutral, PublicKey Token=ced78d295d1e0f2b'   at MyDllVerify.App..cctor()

我想指示C#程序使用1.2.anything版本的任何COM / C ++ dll。

我可以在C#项目中的何处进行配置?

我建议您不要在C#项目中直接引用COM-dll。 如果这样做,则在生成时始终会生成一个新的COM-interop-dll。 这会导致很多问题。

创建COM-interop-dll,将其存储在库文件夹中,并在C#项目中引用该库将是更好的方法。 保持此COM-interop-dll尽可能静态。 如果这样做的话,只要您的接口不变,就可以随意替换使用过的COM-dll。

您可以尝试操作此互操作程序集并在那里进行1.2。*的版本检查,如果您确实想要这样做(我不建议这样做,这可能会引起严重的混乱)。

说明:COM-interop-dll是常规的.NET程序集。 它就像C#代码和要在C#代码中使用的COM-C ++代码之间的包装器一样工作。

COM-interop-dll不必为COM注册。 您可以多次安装此程序集。 但是,它要求您的COM-dll已为COM注册。

有用的工具:

  • lb
  • 再高潮

我在上一个问题中对其进行记录的方式没有什么不同。 您仍然使用<bindingRedirect>允许加载错误版本的互操作程序集。

在实践中不太可能工作,使用COM时弄乱DLL Hell是极其不明智的。 如果使用早期绑定,则COM无法验证您正在调用正确的方法。 与.NET非常不同,.NET可以在运行时从程序集中的元数据中进行此类检查。 如果C ++程序员正确地执行了操作,则他更改了更改类型的指导。 这将使您的代码炸弹与E_NOINTERFACE一起使用,因为您将使用旧版本的向导。

不幸的是,如果他没有这样做,那么您的程序可能会因为诸如AccessViolationException之类的讨厌内容而崩溃。 更糟糕的是,它不会崩溃,但是会调用完全错误的方法。

当您使用后期绑定时,失败模式会更加温和,当该方法不存在或者其参数已更改时,您会收到IDispatch错误之一。 并不是说这最终解决了任何问题,而是您仍然有一个无法正常运行的程序。 只有当您喜欢危险地生活时,DLL Hell才会如此混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM