0

相互運用を可能にするために、C#で記述されたローカルサーバーをアンマネージコードに公開しようとしています!マネージコードは次のようになります。


    [Guid("A0D470AF-0618-40E9-8297-8C63BAF3F1C3")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMyLocalInterface
    {
        void LogToServer(string message);
    }

    [Guid("9E9E5403-7993-49ED-BAFA-FD9A63A837E3")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class MyLocalClass : IMyLocalInterface
    {
        public MyLocalClass()
        {
            Console.WriteLine("Object created!");
        }

        public void LogToServer(string message)
        {
            Console.WriteLine("Log > " + message);
        }
    }

    class Program
    {
        [MTAThread]
        static void Main(string[] args)
        {
            var srv = new RegistrationServices();
            var cookie = srv.RegisterTypeForComClients(typeof(MyLocalClass), RegistrationClassContext.LocalServer | RegistrationClassContext.RemoteServer, RegistrationConnectionType.MultipleUse);

            Console.ReadLine();

            srv.UnregisterTypeForComClients(cookie);
        }
    }

そして、私のアンマネージコードは次のことを行います。


#import "ManagedLocServer.tlb" no_namespace raw_interfaces_only

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    {
        IMyLocalInterfacePtr ptr;
        ptr.CreateInstance(__uuidof(MyLocalClass));

        ptr->LogToServer(L"Initializing...");

    }
    CoUninitialize();
    return 0;
}

CoCreateInstanceが問題なく動作することをデバッグした後、「オブジェクトが作成されました」が管理対象サーバーのコンソールに出力されることを意味します。ただし、そのオブジェクトのQueryInterfaceはE_NOINTERFACEで失敗します。なぜこれが起こるのか少し混乱しています。登録に問題がありますか(CLSIDのLocalServer32エントリしかありません)?マネージコードに問題がありますか?誰かが私にヒントを与えることができればいいでしょう:)

ジョーのご挨拶

4

1 に答える 1

2

アウトプロセス COM を使用しています。メソッド呼び出しを行うには、メソッドの引数をシリアル化する必要があります。これは通常、midl.exe によって .idl ファイルから生成されたコードからプロキシ/スタブ DLL を構築することによって行われます。または、タイプ ライブラリで動作する標準のマーシャラーを使用します。どちらも HKCR\Interface にレジストリ エントリが必要です

COM がマーシャラーを見つけられないため、E_NOINTERFACE が返されます。.idl ファイルはあるが、ない場合、これは簡単に解決できます。サーバーは .NET で実装されています。これを解決する方法がわかりません。これを機能させようとしたことはありません。少し考えられるのは、CLR 相互運用レイヤーがマーシャリングのサポートを提供しているということです。しかし、少なくとも ComInterfaceType.InterfaceIsDual を使用する必要があります。これは単なる推測です。これを機能させようとすると、最初に .idl から開始します。

于 2011-02-02T14:03:34.970 に答える