【问题标题】:COM application referenced dlls troubleshootingCOM 应用程序引用的 dll 疑难解答
【发布时间】:2017-06-28 17:48:24
【问题描述】:

我有一个 WPF 应用程序,我将它构建为一个 dll COM 组件并使用 installshieldLE 安装,但是在运行我的 COM 客户端时,我遇到了一些依赖 dll 的问题。

我的 WPF dll 引用了位于同一 VS2012 解决方案中的另外两个 C# dll(A 和 B)。

我的 WPF dll 已选中注册 COM 互操作选项,并为运行 WPF GUI 应用程序提供 COM 接口。

我有一个 C COM 客户端程序,用于测试 WPF 应用程序。我遇到的问题是我需要在客户端程序的文件夹中包含一些 dll_A 引用的 dll(这是第三方图形包),以便应用程序成功运行。我不必在本地客户端目录中包含 dll_A 或 dll_B。

此外,COM 服务器 dll 引用并包含在安装中的其他 (C) dll 不需要存在于客户端目录中,因此很难理解。

我认为这不是 WPF 问题,而只是关于 com 服务器安装与其他引用程序集相关的问题。

我在主 dll 中输出了一些调试消息,确认 dll A&B 以及主 COM dll 正在从安装位置运行。但是当本地客户端文件夹中缺少第三方 dll 时,我会进一步遇到异常。

请有人帮我解决这个问题。我可以从安装位置成功运行客户端程序,因此可以确定所有必需的程序集和 dll 都存在。

谢谢。

【问题讨论】:

    标签: c# com installation assemblies


    【解决方案1】:

    听起来您遇到了与 DLL 加载路径相关的问题。客户端应用程序可以加载您的 COM DLL,但您的 COM DLL 无法加载它自己的依赖项(或依赖项的依赖项等),即使依赖项与 COM DLL 存在于同一文件夹中。这是正确的吗?

    如果是这样,我相信这个问题可以通过调用AddDllDirectory 函数来解决——只需让您的COM DLL 在加载其任何依赖项之前调用它,并在完成后调用RemoveDllDirectory。有关详细信息,请参阅LoadLibrary 文档的备注部分。

    【讨论】:

    • 是的,你是对的。我将研究 SetDllDirectory 函数。感谢您的意见。
    • @user5265160 :我突然想到 AddDllDirectory/RemoveDllDirectory 比 SetDllDirectory 好。答案已更新。
    • 感谢您的反馈。知道这一点很有用。我的问题与 COM/.Net 有关。其中一个依赖 dll 是使用 .Net 4.0 编译的,而其他依赖 dll 是使用 .Net 4.0 客户端版本编译的。当依赖的 dll 与 COM 客户端位于同一目录中时,这似乎很好,但当它们位于 COM 服务器 dll 中时则不然。
    【解决方案2】:

    该问题是由使用 .Net 4.0 编译的引用 dll 之一引起的,而其他 dll 是使用 .Net 4.0 客户端编译的。使用 .Net 4.0 客户端重新编译解决了这个问题。

    当应用程序作为注册的 com 组件执行时,似乎会出现问题,而客户端是从不同的位置执行的。如果有问题的 dll 被复制到客户端目录,一切运行正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多