繁体   English   中英

在运行时加载COM dll?

[英]Load a COM dll at runtime?

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

我认为我应该能够通过它的文件路径来引用dll,将特定版本保留为false,将interop类型保留为false,将local复制为false,它将仅使用计算机拥有的任何版本,但是当出现错误时我这样做-“调用的目标已引发异常。”

有没有办法延迟绑定dll,即使它是COM?

我可以提供任何您认为有帮助的代码示例,但这更多的是项目设置问题。

编辑:非常感谢大家的帮助。 我找到了另一个人的问题的解决方案,并将其发布在这里。

后期绑定到COM对象要求您不要在.NET项目中添加对COM库的引用。 相反,您应该使用类似以下的方法来创建COM对象:

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

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

有关更多详细信息,请参见本文

这是解决方案

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

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

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;
        }
    }
}

暂无
暂无

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

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