2011-09-22 63 views
2

前提問題:VB6到COM可調用.NET包裹 - 發現.NET庫

  • 寫了COM-調用包裝(CCW)在C#編寫由VB6代碼調用。
  • C#代碼包含必須使用的.NET庫(第三方)。
  • 包裝的C#類實例化罰款,正確地引發事件,正確地採取方法調用。

問題:

  • 的VB6代碼,運行C#代碼時,當C#代碼試圖訪問上述附加.NET庫得到一個錯誤。

過程進行測試:

  • C#代碼包裹完成。
  • 編寫VB6代碼,引用創建的COM DLL。
  • 當C#代碼嘗試從內部訪問.NET庫時收到「文件未找到...」錯誤。
  • 將第三方.NET庫複製到VB6代碼的主文件夾中(也放到system32文件夾中)。
    • 仍「找不到文件...」錯誤。
  • 寫了一個C#Windows窗體測試項目。引用了C#打包的代碼。
    • 收到與VB6代碼相同的錯誤。
  • 在C#Windows Form測試項目中,引用了 C#包裝代碼使用的.NET庫。
    • 該程序運行得很好。

結論/問題:

  • 能VB6呼叫/使用引用其他第三方.NET庫一個COM可調用包裝的C#程序?
+1

嘗試將第三方dll放在GAC中 – albertjan

+1

使用fuslogvw.exe排除程序集解析問題。 –

+0

異常信息是有用的,也許你忘了「copy local == true」 –

回答

0

我已經完成了大量的第三方庫,只要第三方庫DLL與C#DLL在同一目錄下就不會有問題。

  1. 將它們複製到同一目錄作爲您的VB6的代碼會做什麼,VB6的代碼的有效目錄在VB6調試運行時,爲%ProgramFiles%\微軟的Visual Studio \ VB98,所以代碼的運行就沒有能見度。
  2. system32目錄與DotNet dll無關(它們影響的唯一DLL是PInvoke的dll,你說你添加了一個引用,所以情況並非如此)。

將第三方庫添加到GAC應該修復這些問題,但由於需要對DLL進行簽名,所以這不一定是可能的/容易的。所以只要確保你引用的庫在你的庫的目錄中,並且VB6實際上引用了你的庫的版本(Debug/Release,不管上次編譯的是什麼)。您可能需要將RegAsm庫交給庫,以確保Com註冊了正確的庫。

所以要sumerize,假設你的源代碼如下所示:

c:\projects\vb6project 
c:\projects\c#project 

和你的項目設置爲調試,第三方庫應該是:

c:\projects\c#project\bin\Debug 

當你真正想要的分發應用程序,確保所有庫與VB6 exe位於同一目錄中。

0

這將反映克里斯埃裏克森的答案。

首先,爲了解決這些問題,我沒有使用GAC。假設我的VB6應用程序位於c:\ program files \ mycompany \ vb6app.exe中,我將該COM友好的.NET dll(讓它稱爲net4vb.dll)與可執行文件放在該文件夾中。然後,我使用/ codebase選項regsiter,在那裏使用RegAsm。最後,我將包含或使用的.NET程序集放在該文件夾中(讓我們稱之爲purenet.dll)。

此時,vb6app.exe應該沒有錯誤地運行。

請務必注意,如果您在Visual Studio中選擇「註冊COM Interop」,那麼它將覆蓋您在上面執行的註冊。所以不要使用這個選項。只使用命令行工具。