2011-02-02 4 views
0

interopを可能にするために、C#で書かれたローカルサーバーをアンマネージコードに公開しようとしています。マネージコードのようになります。管理されたCOMローカルサーバーを公開する - E_NOINTERFACE


    [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); 
     } 
    } 
 

そして、私のアンマネージコードは以下のん:IVEはCoCreateInstanceのは何の問題もなく動作することを見てデバッグした後

 

#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; 
} 
 

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

挨拶 ジョー

答えて

2

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

COMはマーシャラを検出できないため、E_NOINTERFACEを取得します。 .idlファイルを持っていてもそうでない場合は解決するのは簡単ですが、サーバーは.NETで実装されています。どのようにこれを解決するためのアイデアは、私はこの仕事をしようとしたことはありません。遠隔の可能性は、CLR interopレイヤがマーシャリングのサポートを提供することです。しかし、少なくともComInterfaceType.InterfaceIsDualを使用する必要があります。これは単なる推測です。私がこの作業をしようとすると、まず.idlから始めます。

+0

'regasm/tlb'を使ってタイプライブラリを作成し、そのタイプライブラリをレジストリに登録しようとすると、オートメーションのマーシャリングが無料になる可能性がありますか? – sharptooth

+0

@sharp - 私は気にしません、そのツールは長い間awolされています。私のマシンでは、regtlibv12.exeという名前で.NET 4.0に戻ってきました。どんなドキュメントでも、/でもない?助け、私はそれが何をしているのか分からない。私はHKCR \ TypeLibに書き込むことを期待していますが、HKCR \ Interfaceに必要なエントリを書くことは、既存の登録を壊す可能性が非常に低いと私を驚かせます。 –

関連する問題