Csharp/C#教程:在运行时加载COM dll?分享


在运行时加载COM dll?

我正在编写Peachtree API的应用程序,它需要使用任何版本的API。 不幸的是,Peachtree 2011的dll无法与Peachtree 2010交互,反之亦然,即使两个dll存储在同一位置并使用完全相同的代码运行。

我以为我应该能够通过它的文件路径引用dll,将特定版本保留为false,将interop类型嵌入为false,并将本地复制为false,它只会使用机器具有的任何版本,但是当我得到错误时我这样做 – “调用的目标引发了exception。”

有没有办法尽快绑定dll,即使它是COM?

我可以提供您认为有用的代码示例,但它更多的是项目设置问题。

编辑:非常感谢你的帮助。 我在另一个人的问题上找到了我的解决方案并在此处发布。

延迟绑定到COM对象要求您不要将COM库的引用添加到.NET项目中。 相反,你应该使用这样的东西来创建COM对象:

Type type = Type.GetTypeFromProgID("Excel.Application") object app = Activator.CreateInstance(type); 

然后,它将在运行时绑定到任何版本的COM库。

有关详细信息,请参阅此文章 。

这是解决方案

在.NET中编译与版本无关的DLL

如果链接死亡,关键是处理AppDomain.CurrentDomain.AssemblyResolve事件,如下所示。 只要程序集绑定失败,事件就会触发,因此您可以自行解决它,修复版本冲突。

上述就是C#学习教程:在运行时加载COM dll?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 using System.Reflection; static Program() { AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e) { AssemblyName requestedName = new AssemblyName(e.Name); if (requestedName.Name == "Office11Wrapper") { // Put code here to load whatever version of the assembly you actually have return Assembly.LoadFile("Office11Wrapper.DLL"); } else { return null; } } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/958799.html

(0)
上一篇 2021年11月23日
下一篇 2021年11月23日

精彩推荐