2012-08-13 44 views
1

美好的一天,閱讀C++項目中的C#函數

我想採用現有的C#項目並將函數包裝到C++/CLI DLL中。我需要能夠從VB 6讀取這個DLL。我選擇這個路由是因爲我不需要註冊一個.net DLL以便在VB 6中使用它。坦率地說,我沒有這方面的經驗,所以我將非常感謝一個很好的例子。我知道有很多這樣的類似問題,但我一直無法找到足夠簡單的東西來理解。

+0

我覺得你之所以使用C++是錯誤的,你必須註冊**任何**與COM DLL,以便與VB6使用它,無論是用C#或C++編寫,你必須做同樣的註冊。 – CodingGorilla 2012-08-13 15:09:22

+0

如果它是一個標準的DLL,我可以用regsvr32註冊它,而不是regasm。 regasm給了我很大的麻煩 – 2012-08-13 15:10:54

+0

好吧,我以爲你是指通常需要COM的註冊表。我多年前使用ATL(活動模板庫)編寫了一些C++ COM組件,所以這可能是一個很好的開始。但是這是很多工作(我記得)。 – CodingGorilla 2012-08-13 15:15:28

回答

0

成爲一名男子,並通過幾種不同的編譯/鏈接/函數調用協議配置來製作該DLL。然後繼續在VB6項目中嘗試幾種不同的引用配置。發佈什麼工作。貢獻,出發!

1

這是一條相當不明智的路線,使得C#代碼[ComVisible]非常簡單,Regasm.exe不應該嚇到你。 Regasm的常見錯誤是忘記在開發機器上使用它的/ codebase選項。

如果你堅持不利用這個,那麼你需要找到一種方法來讓自己加載CLR,以便它可以執行你的C++/CLI和C#代碼。有三種基本的方式來做到這一點。如果主機應用程序是VB6,那麼你已經寫下了COM互操作並且自己託管CLR並不是很實用。但是,您可以利用C++/CLI編譯器生成非託管DLL入口存根的能力,爲您加載CLR並切換到託管代碼執行。通過編寫一個用__declspec(dllexport)裝飾的靜態函數來實現這一點。該技術顯示在this answer。注意它不是特別的表現,你必須忍受VB6 Declare語句施加的限制。

也檢查此post-processing tool,可以將這些存根直接注入到C#程序集。不知道它有多可靠,我自己也沒有用過它。

+0

我本來希望使用COM互操作,但我必須將此軟件分發給可能沒有.NET框架的工作站。我使用這種方法,我設法讓它在我的電腦上正常工作,但分發似乎更棘手。你會怎麼做? – 2012-08-13 16:00:22

+0

這沒什麼意義,當你想使用C#或C++/CLI時,你總是*必須安裝.NET。無論你使用Regasm方法還是這種黑客方式。如果它尚未預安裝,那麼使用安裝項目創建的簡單安裝程序即可完成安裝。可以註冊程序集的同一類項目,Register = vsdrpCOMSelfReg – 2012-08-13 16:07:25