COM 应用程序引用的 dll 故障排除
COM application referenced dlls troubleshooting
我有一个 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 都存在。
谢谢。
听起来您遇到了与 DLL 加载路径相关的问题。客户端应用程序可以加载您的 COM DLL,但您的 COM DLL 无法加载它自己的依赖项(或依赖项的依赖项等),即使依赖项存在于与 COM DLL 相同的文件夹中也是如此。这是正确的吗?
如果是这样,我相信可以通过调用 AddDllDirectory
function -- just have your COM DLL call this before loading any of its dependencies and call RemoveDllDirectory
when it's done. For more information, see the Remarks section of the documentation for LoadLibrary
.
来解决这个问题
问题是由于引用的 dll 之一是使用 .Net 4.0 编译的,而其他的是使用 .Net 4.0 客户端编译的。使用 .Net 4.0 Client 重新编译解决了问题。
问题似乎是在将应用程序作为已注册的 com 组件执行时出现的,而客户端是从不同的位置执行的。如果有问题的 dll 被复制到客户端目录,一切运行正常。
我有一个 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 都存在。
谢谢。
听起来您遇到了与 DLL 加载路径相关的问题。客户端应用程序可以加载您的 COM DLL,但您的 COM DLL 无法加载它自己的依赖项(或依赖项的依赖项等),即使依赖项存在于与 COM DLL 相同的文件夹中也是如此。这是正确的吗?
如果是这样,我相信可以通过调用 AddDllDirectory
function -- just have your COM DLL call this before loading any of its dependencies and call RemoveDllDirectory
when it's done. For more information, see the Remarks section of the documentation for LoadLibrary
.
问题是由于引用的 dll 之一是使用 .Net 4.0 编译的,而其他的是使用 .Net 4.0 客户端编译的。使用 .Net 4.0 Client 重新编译解决了问题。
问题似乎是在将应用程序作为已注册的 com 组件执行时出现的,而客户端是从不同的位置执行的。如果有问题的 dll 被复制到客户端目录,一切运行正常。