注册免费COM而不将dll复制到与可执行文件相同的目录

时间:2011-06-18 04:27:15

标签: com-interop regfreecom

如何在不将dll复制到与可执行文件相同的目录的情况下使用无注册的COM对象?这可能吗?

我想要一份完整的工作样本或详细的分步指南,以了解我的具体情况。

例如,我有以下部分:
CppTestRunner.exe - vc ++控制台应用程序
CppTests.dll - vc ++ mfc dll
CsCOMServer.dll - c#COM visible dll

我不想修改exe或其目录,例如添加外部清单 CppTests.dll与exe不在同一个目录中 如果CsCOMServer.dll与CppTests.dll在同一目录下,也没关系。

CppTestRunner.exe在CppTests.dll上调用LoadLibrary,工作正常。

在嵌入清单并使用Windows激活上下文apis之后,我能够将CsCOMServer.dll复制到exe目录,以验证CppTests.dll可以创建CsCOMServer.dll实例而不会出现问题,但我再次尝试避免这一步。

目前,由于CsCOMServer.dll与CppTests.dll位于同一目录中,并且exe目录中没有CsCOMServer.dll,因此在调用CoCreateInstance时出现以下错误:
错误= 0x80070002系统找不到指定的文件。

我使用了sysinternals进程监视器来跟踪CppTestRunner.exe查找的路径等。
我注意到,根据我尝试的事情,有时CppTestRunner.exe尝试在与CppTests.dll相同的目录中读取CsCOMServer.dll.config,但无论我尝试放在那里,我都无法获得超过错误。
另外,根据我尝试的其他事情,CppTestRunner.exe尝试在与CppTests.dll相同的目录中读取CsCOMServer.dll但由于某种原因,我仍然得到相同的错误。

任何人都知道这个确切场景的工作代码吗?

正如您可能已经知道的那样,这是某些单元\集成测试的一部分。

作为一个简单的解决方法,我目前正在将CppTestRunner.exe复制到与CppTests.dll相同的目录并从那里运行它,但是我想避免这一步。

谢谢。

2 个答案:

答案 0 :(得分:3)

.NET首先在GAC中查找托管免注册COM,然后在可执行文件夹中查找。它使用激活上下文来读取激活元数据,但不确定文件本身的位置。

答案 1 :(得分:1)

您可以将DLL保存在子文件夹中,假设 DLLFolder \ YourDll.dll ,并在yourDll的清单文件中,写下文件名,如

<file name = "DLLFolder\YourDll.dll">

但是你需要将(DLL的)清单文件保存在保存EXE的位置。