アンマネージド VC++ COM Excel アドインとマネージド C# コンソール アプリケーションの間で IPC を実現したいと考えています。現在、NetNamedPipeBinding を使用して管理された C# アプリケーション間の IPC を実現しています。NetNamedPipeBinding を使用して、アンマネージド アプリケーションとマネージド アプリケーションの間で IPC を実現したいと考えています。
WWSAPI を使用してみましたが、 CodeProjectのサンプルに従って同じことを達成しました。MSDN リファレンスlink1、link2およびlink3で説明されているように、NetNamedPipeBinding は WWSAPI で使用でき、Windows 8 SDK に同梱されています。
以下は、私の C# コンソール アプリケーションのコード サンプルです。
Uri baseAddress = new Uri("net.pipe://localhost/Server");
serverHost = new ServiceHost(this, baseAddress);
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.Security.Mode = NetNamedPipeSecurityMode.None;
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy12;
serverHost.Description.Behaviors.Add(smb);
serverHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexNamedPipeBinding(), "mex");
serverHost.AddServiceEndpoint((typeof(IAdd)), binding, baseAddress);
serverHost.Open();
IAdd は、次のように定義されているインターフェイスです。
[ServiceContract]
public interface IAdd
{
[OperationContract]
void PerformAddition(int val1, int val2);
}
次に、サービスを開始し、次のコマンドを実行して wsdl および xsd ファイルを生成します。
svcutil /t:metadata net.pipe://localhost/Server
この後、WsUtil を使用して必要なヘッダー ファイルを作成します。ただし、ヘッダー ファイルを作成しようとすると、次の警告が表示されます。
warning WSUTIL0089 入力メタデータに、サポートされているポリシー設定が見つかりませんでした。サービスは、メッセージ セキュリティ設定など、WWSAPI でサポートされていないバインディング構成を使用している可能性があります。WWSAPI でサポートされている構成のリストについては、ドキュメントを参照してください。
ここで、C# コンソール アプリケーションのバインディング タイプを WSHttpBinding または NetTcpBinding に変更すると、WsUtil を使用してヘッダー ファイルを正常に作成できます。
WsHttpBinding を使用するには、サービスを開始するために管理者権限が必要であり、通常、マネージド アプリケーションは非管理者権限で実行されるため、使用できません。また、MSDN で、Net Named Pipe Binding が同じマシン上の IPC 用に最適化されていることを読みました。これは理想的には私の場合です。
必要に応じて、管理されていない C++ と管理された C# のサンプル コードを共有できます。
アンマネージド C++ とマネージド C# の間で NetNamedPipeBinding を達成することに関するヘルプをいただければ幸いです。
PS: アンマネージド VC++ COM アドインをマネージド VSTO アプリケーションに移植できません