2

を使用して2つのCOMDLLのラッパーを作成しましたTlbImp.exe。1つには、ラッパーが次のように説明するクラスがあります。

using System;
using System.Runtime.InteropServices;

namespace GNOTDRSIGNATURESERVERLib
{
    [CoClass(typeof(GNOTDRSignatureServerClass)),
        Guid("20CBF9E0-06BF-11D3-97B5-0080C878CFFA")]
    public interface GNOTDRSignatureServer
    {
    }
}

このオブジェクトはパラメータとして渡す必要があります

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace GN8000Lib
{
    [TypeLibType(2),
         ClassInterface(0), 
         ComSourceInterfaces("GN8000Lib._I8000Events\0"),
         Guid("DCAD84FE-43A8-11D3-B1A2-005004131886")]
    public class GN8000Class : I8000
    {
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern GN8000Class();

        [DispId(6)]
        [MethodImpl(MethodImplOptions.InternalCall)]
        void I8000.Initialize(
            [IUnknownConstant] [MarshalAs(UnmanagedType.IUnknown)] [In]
            object pSigServer = null);
    }
}

次に、次のようにメソッドを呼び出します。

var gn8000 = new GN8000();
var signatureServer = new GNOTDRSignatureServer();
gn8000.Initialize(signatureServer);

渡されているオブジェクトは正しいものではないと思います。TlbImp.exeそれらのDLLをリンクして、GNOTDRSignatureServerの代わりに使用UnmanagedType.IUnknownできる、または使用できるように感じますSystem.Runtime.InteropServices.Marshal.GetComInterfaceForObject

私のコードの何が問題になっていますか?

4

1 に答える 1

2

宣言はかなり醜いように見えますが、何らかのリバース エンジニアリング ツールによって生成されたものであり、自分で記述したものではないと仮定します。その場合、空のインターフェースを持つことはそれほど珍しいことではありません。COM で同等のものはdispinterfaceです。これは、IDispatch によるレイト バインディングのみをサポートするインターフェイスです。これはかなり一般的です。COM サーバーは、スクリプト言語、つまり遅延バインディングのみをサポートするランタイム環境で動作するように設計されている可能性があります。.NET の ComInterfaceType.InterfaceIsIDispatch と同じです。[DispId] はレイト バインディングで重要です。名前ではなく番号で呼び出します。

これにより、引数の型を説明しやすくなります。スクリプト言語は、変数の型として VARIANT を使用します。C# コードでオブジェクトとして宣言する変数とよく似ており、任意の値を格納できます。機能であり、バグではありません。

于 2012-02-02T14:13:18.137 に答える