2010-07-27 64 views
7

我有一個用.Net編寫的類庫,我希望可以提供給VB6/VBA。我試過的東西沒有用(顯然是因爲我在問這個問題)。這是我做的:製作一個DLL COM可訪問

  1. 我在Visual Studio 2010 Express中創建了一個類庫項目,並將代碼放在一個類模塊中。
  2. 我打開了項目屬性並去了「Assembly Information」並選中了「Make COM Visible」。
  3. 我去了「高級編譯」選項和針對.Net 2.0(它是非常簡單的代碼)。
  4. 然後我刪除了所有對「System」的引用。
  5. 我建項目(無警告或錯誤),並複製該DLL的Bin文件夾放到C的:\ WINDOWS \ SYSTEM32 \
  6. 我跑Regsvr32註冊DLL和得到了錯誤:

The module "MyDll.dll" was loaded but the entry-point DLLRegisterServer was not found.

Make sure that "MyDll.dll is a valid DLL or OCX file and then try again.

顯然我的第一次嘗試有點幼稚。有人可以提供指導嗎?

+2

regsvr32不能在.NET程序集上使用。使用'regasm'和可選參數 - http://msdn.microsoft.com/en-us/library/tzat5yw6%28VS.71%29.aspx – 2010-07-27 18:33:43

回答

10

步驟#6是錯誤的。帶有[ComVisible]類型的.NET程序集在Regasm.exe中註冊。如果您不想將DLL安裝到GAC中,請使用/ codebase命令行選項。/tlb命令行選項創建類型庫,您可以在VB6項目中使用它。

+0

我爲regasm.exe做了一個文件搜索,它似乎缺少。這僅適用於完整版本的Visual Studio嗎? MS提供了一個下載(我仍然使用谷歌搜索,但我想你可能只知道。) – Oorang 2010-07-27 18:53:23

+2

它應該在c:\ windows \ microsoft.net \ framework \ v4.0.30319目錄中。您錯過了「Visual Studio命令提示符」以簡化操作。但這是可以完成的。 – 2010-07-27 18:58:03

+0

好的,我找到RegAsm並使用它。這創建了一個我可以參考的tlb。當我在VB6/VBA中打開它時,所有屬性和方法都丟失了。通過閱讀其他一些鏈接,我推斷我需要創建一個接口(我沒有做的事情,我剛剛創建了這個類)。我仍在調整界面,但這是一個重大步驟。謝謝。 – Oorang 2010-07-27 19:57:07

0

我相當肯定RegSvr32只適用於非.NET DLL。 .NET程序集存儲在全局程序集緩存(GAC)中。您必須運行gacutil.exe。

+0

將它們放入GAC是沒有必要的。用'/ codebase'鍵重新設置就好了。 – sharptooth 2010-07-28 05:10:54

+0

@sharptooth:謝謝我不知道 – 2010-07-28 14:00:39

3

您需要爲接口定義GUID並標記哪些類實現哪些接口才能啓動。 MSDN有一個getting started guide。你並不需要運行的RegSvr32,但你需要把DLL某處where the app can find it

After registering an assembly using Regasm.exe, you can install it in the global assembly cache so that it can be activated from any COM client. If the assembly is only going to be activated by a single application, you can place it in that application's directory.

還有整個過程here的一個很好的概述。

+0

+1對於鏈接。 – Oorang 2010-07-27 20:09:57

0

使用GacUtil而不是RegSvr32。 RegSvr用於使用VB6創建的dll,而.NET DLL則需要使用GacUtil,因爲它被添加到全局程序集緩存中。