2012-11-13 118 views
3

我在MSDN上發佈了這個問題,但是通過與MS支持溝通有點浪費時間,他們每天只給你一句話,沒有任何線索:(無論如何,這裏是我的問題,欣賞任何評論。如何加載在GAC中註冊的混合程序集?

我在我的互操作的項目經歷組件加載問題

即有3個VS項目:

  • A是原生的C項目,通過靜態綁定,即A引用b都會調用B的功能,如果你like;

  • B是一個CLI包裝器,它依次靜態引用C的對象;

  • C是一個純粹.NET代碼的CS項目。

B和C與強名稱簽名,和他們的AssemblyInfo.csAssemblyInfo.cpp文件與它們的密鑰文件進行更新。

B和C都在GAC中註冊,使用gacutil.exe V4.0。 A從B.dll註冊的文件夾引用B.dll,B在C註冊的同一forlder中引用C.

當我運行從A程序,它失敗消息:

「的計劃,因爲B.DLL從您的電腦丟失,可能會無法啓動。嘗試重新安裝>該程序來解決這個問題'。

我可以使它工作的唯一方法是將B.dll複製到A.exe的同一個文件夾中。看起來好像是從GAC加載的C.dll。

在加載透視圖中混合裝配以不同方式工作嗎?

+0

順便說一句,它不工作複製本地選項true或false。 – user1821130

+0

你'gacutil''d B?你不需要'regsvr32'嗎,因爲它需要從非CLI程序訪問? – CodeCaster

+0

感謝CodeCaster。這是一個我沒有想到的好點,實際上B不需要在GAC中,只要它被PATH覆蓋,所有工作都按預期工作。 – user1821130

回答

0

您正在使用一些黑客手段來獲取CLR,以執行託管代碼。據推測,你在CLI代碼中編寫了靜態函數,並用__declspec(dllexport)對它們進行了修飾。是的,這是有效的,本地代碼(A)可以通過C++/CLI編譯器生成的存根調用,以確保CLR被加載和初始化。

然而,無法工作的是CLR幫助在GAC中找到DLL。這是一個雞與雞蛋的問題,CLR必須先加載才能找到程序集。所以B找到C是沒有問題的。但是,發現B不會起作用。找到B本地Windows加載程序的工作並沒有任何理由查找GAC。

您需要將B部署到與本機程序相同的文件夾中。

+0

感謝Hans Passant所有的解釋,現在對我來說更加清楚,只要我在PATH中包含B'd文件夾,它一切正常。 – user1821130

相關問題