2009-07-23 9 views
33

私はC#で書かれたシンプルなクラスライブラリを持っています。シンプルなC#DLL - Excel、Access、VBA、VB6からどのように呼び出すのですか?

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

私の質問は、このHelloWorld関数をMicrosoft Office Visual Basic(これはVB6だと思います)から呼び出すことができますか?

私の最初のステップはDLLを参照として追加することでしたが、コンパイルされたDLLをブラウズして選択すると「指定したファイルへの参照を追加できません」というメッセージが表示されました。投げられた。

誰でも正しい方向に私を指摘することができますか?

あらかじめありがとうございます。

+0

interopタグのdllimportタグを交換する... – Ant

答えて

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 interopに登録]を選択します。結果をすぐに見ることができます。別のマシンにdllをインストールするには、regasmを使用する必要があります。あなたはまた、dllファイルを参照し、事前バインディングを使用することができます

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

:その後に

がこれを消費

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

AnthonyWJonesさん、本当に良い回答に感謝します。この回答を投稿して以来、私は検索していましたが、インターフェースを宣言しなければならなかったことをすべて発見しました!本当にありがとう!! – divinci

+0

インターフェイスを宣言せずに行うこともできますが、COMクライアントで特に消費されるインターフェイスを使用することをお勧めします。 – AnthonyWJones

+0

ありがとうアンソニー、私が投稿したフォローアップの回答を批判してもらえますか? – divinci

0

AnthonyWJonesの良い答えに追加するには、また、あなたのDLLを登録する必要があります必要なレジストリエントリを追加するRegasm.exeを使用します。

+0

申し訳ありませんが、AnthonyWJonesがすでにRegasmについて言及していたことに気付かなかった。 –

19

また、別のコンピュータにDLLを登録する際には、拡張する必要があります。コンパイルして、プロジェクトのプロパティ]タブをビルドし

を持っている場合は、開発マシン上で上記のコードをビルドすると

は、COM相互運用のための登録を選択します。

コンパイルされた* .dllが見つかるVisual Studio出力フォルダ(通常はbin \ Debug)には、* .tlbファイルも含まれます。

この* .tlbファイルは「タイプライブラリ」です。また、* .dllのさまざまな「タイプ」を理解し、基本的にクライアントマシンにその使用方法を伝えるためには、クライアントマシンが必要です。

上記の「COM相互運用機能の登録」と同様に* .tlbファイルを作成すると、アセンブリ(dll)はマシンに登録されておりアクセス可能です。あなたは今

VBAエディタで参照としてこのファイルを追加することができますVBAで

- >ツール - >参照 - >ブラウズ -

を選択>これはあなたが宣言することができますあなたの図書館で見つかったクラス。

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

は、しかし - そのマシン上のアセンブリ(DLL)を登録するには - あなたはその後、別のクライアントマシン上で自分のDLLを使用したい場合は、Regasm.exeによってを使用する必要があります。

これは、コマンドラインによって行うことができ、この場合一度

Regasm.exeによってTestDll.dll

Regasm.exeによって

あなたは新しいクライアントマシンにアセンブリを登録しました。 * .tlbへの参照をもう一度追加することでアクセスすることができます

これは役に立ちます。

+0

はい私はそれがうまく網羅されていると思います – AnthonyWJones

+0

開発マシンまたはクライアントマシンでregasmを実行しますか?クライアントマシンに.NETがインストールされていないためです。 – Alexey

+0

Alexey the .Net DLLは、クライアントマシン上で実行する.Netフレームワークが必要です。 – divinci

6

Visual Studio 2008で生成された.tlbファイルを取得するには、アプリケーション|アセンブリ情報を表示し、[アセンブリCOMを表示する]を選択します。それを見つけるために私はしばらくの間、それが他の人を助けることを願っています。

+1

+1ありがとう、ありがとう、ありがとう!前に非常に間欠的に働いて停止し、これをした後に働く、神は次に何が起こるかを知っていますが、少なくともそれは現在働いています。ここでもVS2010を使用しています。 –

関連する問題