在运行时加载COM dll?

时间:2010-08-31 17:59:57

标签: c# .net com-interop

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

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

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

有关详细信息,请参阅this article

答案 1 :(得分:0)

这是解决方案

Compile a version agnostic DLL in .NET

如果链接死了,关键是处理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;
        }
    }
}