2009-07-23 75 views
33

我有一個用c#編寫的簡單類庫。一個簡單的C#DLL - 我如何從Excel,Access,VBA,VB6中調用它?

using System; 
namespace TestDll 
{ 
    public class Test 
    { 
     public string HelloWorld 
     { 
      get 
      { 
       return "Hello World"; 
      } 
     } 
    } 
} 

我的問題是如何從Microsoft Office Visual Basic(我認爲是VB6)調用這個HelloWorld函數?

我的第一個步驟是將DLL添加作爲參考 - 但瀏覽和選擇已編譯的DLL的消息「無法引用到指定的文件中添加」。被拋出。

任何人都可以點我在正確的方向,爲什麼/如何得到這個工作?

在此先感謝所以!

+0

交換互動標籤的dllimport標籤... – Ant 2009-07-23 10:39:07

回答

47

您無法通過COM互操作訪問靜態成員。事實上,你的代碼甚至不會編譯,該方法應該在一個類中。這裏是你如何做到這一點:

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")] //Allocate your own GUID 
public interface _Test 
{ 
    string HelloWorld { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("E2F07CD4-CE73-4102-B35D-119362624C47")] //Allocate your own GUID 
[ProgId("TestDll.Test")] 
public class Test : _Test 
{ 
    public string HelloWorld { get { return "Hello, World! "; } } 
} 

項目屬性生成選項卡,選擇註冊COM互操作。所以你可以很快看到結果。要在另一臺機器上安裝dll,您需要使用regasm。

然後,爲了消耗這一點:

Dim o : Set o = CreateObject("TestDll.Test") 
MsgBox o.HelloWorld 

您也可以參考DLL和使用早期綁定:

Dim o As TestDll.Test 
Set o = New TestDll.Text 
MsgBox o.HelloWorld 
+0

感謝AnthonyWJones,一個非常好的答案 - 自發布此答案以來一直在尋找 - 發現了除了我必須聲明一個接口之外的所有內容!非常感謝!! – divinci 2009-07-23 11:10:59

+0

可以在不聲明接口的情況下完成,但我不會推薦它,使用專門由COM客戶端使用的接口是一種更好的方法。 – AnthonyWJones 2009-07-23 11:38:11

+0

謝謝安東尼,你介意批評我發佈的後續答案嗎? – divinci 2009-07-23 11:48:04

0

爲了增加AnthonyWJones的很好的答案,你還需要註冊您的DLL使用Regasm.exe其中添加了必要的註冊表項。

19

並擴大在不同的計算機上註冊DLL。

一旦你編譯和構建上面的代碼在開發機器上,如果你有

項目屬性生成選項卡,選擇註冊爲COM互操作。

您的Visual Studio輸出文件夾(通常是bin \ Debug),其中編譯的* .dll文件也會有一個* .tlb文件。

此* .tlb文件是一個 '類型庫'。客戶端機器需要了解* .dll中的不同「類型」,並基本告訴客戶機如何使用它。

通過設置上面的「註冊爲COM互操作」 - 藏漢爲被製作了* .tlb文件,裝配(DLL)註冊您的計算機上,因此是可訪問的。

在VBA中,你現在可以通過

VBA編輯這個文件,添加作爲參考 - >工具 - >引用 - >瀏覽 - >選擇

這將允許你再申報在你的圖書館找到的類。

Dim TestClass As Test 
Set TestClass = New Test 
MsgBox TestClass.HelloWorld 

無論其 - 如果你想,然後使用您的DLL不同的客戶端機器上,你將不得不使用regasm.exe - 註冊該機器上的組件(DLL)。

這可以通過命令行完成,

regasm.exe

在這種情況下

regasm.exe TestDll.dll

一次你已經在新的客戶端機器上註冊了程序集,你無線將能夠通過再次添加對其* .tlb的引用來訪問它。* .tlb

希望這有助於!

6

只想評論一下在Visual Studio 2008中,要生成.tlb文件,您還必須在應用程序|裝配信息並選擇「使裝配COM可見」。花了我一段時間才發現,所以希望它能幫助別人。

相關問題