web-dev-qa-db-ja.com

シンプルなC#DLL-Excel、Access、VBA、VB6からどのように呼び出すのですか?

C#で記述された単純なクラスライブラリがあります。

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

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

私の最初のステップは、参照としてDLLを追加することでした-しかし、参照して、コンパイルされたDLLファイル。」がスローされました。

誰がこれをなぜ/どのように機能させるのかについて正しい方向に向けることができますか?

事前にありがとう

38
divinci

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
54
AnthonyWJones

また、DLLを異なるコンピューターに登録することを拡張します。

開発マシンで上記のコードをコンパイルしてビルドしたら、

プロジェクトプロパティの[ビルド]タブで、[COM相互運用機能に登録]を選択します。

コンパイル済みの* .dllがあるVisual Studio出力フォルダー(通常はbin\Debug)にも* .tlbファイルがあります。

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

上記の「COM相互運用機能に登録」を設定することで、*。tlbファイルが生成されると同時に、Assembly(dll)がマシンに登録され、したがってアクセス可能になります。

VBAでは、このファイルを参照として追加できるようになりました。

VBAエディター->ツール->参照->参照->選択

これにより、ライブラリで見つかったクラスを宣言できます。

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

ただし、別のクライアントマシンでdllを使用する場合は、regasm.exeを使用して、そのマシンでAssembly(dll)を登録する必要があります。

これはコマンドラインで実行できます。

regasm.exe

この場合

regasm.exe TestDll.dll

新しいクライアントマシンでアセンブリを登録したら、その* .tlbへの参照を再度追加することでアクセスできます。

お役に立てれば!

22
divinci

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

10
Jage

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

1
Matthew Dresser