2011-06-18 18 views
3

如何在不將可執行文件複製到同一目錄的情況下使用免註冊的COM對象?這可能嗎?註冊免費的COM沒有將dll複製到與可執行文件相同的目錄

我想要一個完整的工作示例或詳細的分步指南,瞭解我的確切場景。

例如,我有以下組成部分:
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激活上下文apis之後,我能夠將CsCOMServer.dll複製到exe目錄以驗證CppTests.dll是否可以創建CsCOMServer.dll的實例而沒有問題,但是我仍然試圖避免這一步。

目前,隨着CsCOMServer.dll在同一目錄CppTests.dll,沒有CsCOMServer.dll在exe文件的目錄,我收到以下錯誤,當我調用CoCreateInstance:
錯誤= 0x80070002系統無法找到指定文件。

我使用Sysinternals的進程監視器追查路徑CppTestRunner.exe看起來在等
我注意到的是,根據事情我嘗試做,有時CppTestRunner.exe嘗試讀取CsCOMServer.dll.config在與CppTests.dll相同的目錄,但無論我嘗試在那裏放置什麼內容,都無法解決錯誤。
也取決於我嘗試做的其他事情,CppTestRunner.exe嘗試讀取與CppTests.dll相同的目錄中的CsCOMServer.dll,但出於某種原因,我仍然收到相同的錯誤。

任何人都知道這個確切的情況下工作代碼?如你所知道的,這是某些單元\集成測試的一部分。

作爲一種簡單的解決方法,我目前複製CppTestRunner.exe到同一目錄CppTests.dll,並從那裏運行它,但想避免此步驟。

謝謝。

回答

2

.NET查找管理的免註冊COM首先在GAC,然後在可執行文件的文件夾。它使用激活上下文讀激活的元數據,但不能確定文件本身的位置。

+0

謝謝。那麼你是說這是不可能的? –

+0

這是不可能的,所以你的解決方法似乎是一個體面的方法。 –

1

您可以保存該DLL的子文件,讓說DLLFolder \ YourDll.dll,並在yourDll的清單文件,寫這樣

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

的文件名,但你需要保持清單在EXE文件的保存位置文件(的DLL)。

相關問題