1

次のように定義されたC#COMインターフェイスがあります

    [ComVisible(true)]
    [Guid("EB6602D5-8458-4733-8F0A-05A88FEEB42F")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMyInterface
    {
        [DispId(1)]
        void Initialize(string szPath, uint uiAddress,
            [MarshalAs(UnmanagedType.Interface)]
            object pEventsImpl,   //Interface pointer for my COM Svr Callback
            [MarshalAs(UnmanagedType.Interface)]
            out object ppCommunication); //Interface for Client to Access Server 
}

この COM インターフェイス用に生成された tlb は次のとおりです。

    interface IMyInterface : IUnknown {
    HRESULT _stdcall Initialize(
                    [in] BSTR szPath, 
                    [in] unsigned long uiAddress, 
                    [in] IUnknown* pEventsImpl, 
                    [out] IUnknown** ppCommunication);
}

C++ クライアント コードでは、C# COM を次のように呼び出します。

hr = pInterface->Initialize(    strPath, iAddress, m_Events, &pUnk);

ただし、次の例外を受け取りました

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
First-chance exception at 0x7c812aeb in MyClient.exe: 0xE0434352: 0xe0434352. Microsoft C++ exception: _com_error at memory location 0x0012f0ac..
A first chance exception of type 'System.Runtime.InteropServices.SEHException' occurred in MyClient.exe
An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in MyClient.exe

ここで何か間違ったことをしましたか? そして、この System.FormatException とは何ですか?

[更新] 追加情報 ** /clr (共通言語ランタイム サポート) オプションを指定して C++ コードをコンパイルしようとしましたが、動作するようです。ただし、異なる構成を使用して再コンパイルしたくない既存のC++クライアントを使用しているため、いくつかの制限があるため、共通言語ランタイムサポートを使用してC++コードをコンパイルしないことが可能かどうかを知りたいです

ありがとう

4

0 に答える 0