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

我想要一个完整的工作样本或详细的分步指南来了解我的确切情况。

例如,我具有以下组件:
CppTestRunner.exe-vc ++控制台应用程序
CppTests.dll-VC ++ MFC DLL
CsCOMServer.dll-C#COM可见dll

我不想修改exe或其目录,就像添加外部清单一样。
CppTests.dll与exe位于不同的目录。
如果CsCOMServer.dll与CppTests.dll位于同一目录中,则可以。

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

在嵌入清单并使用Windows激活上下文api之后,我能够将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所在的目录并从那里运行它,但希望避免此步骤。

谢谢。

有帮助吗?

解决方案

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

其他提示

您可以将DLL保存在一个子文件夹中,例如 DLLFolder \ YourDll.dll ,然后在yourDll的清单文件中写入文件名,如 通用标签

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top