非托管C和x2B之间的IPC+;并使用WCF和WWSAPI管理C#应用程序
我想在非托管VC++COM Excel加载项和托管C#控制台应用程序之间实现IPC。目前,我使用NetNamedPipeBinding在maanged C#应用程序之间实现IPC。我现在想使用NetNamedPipeBinding在非托管和托管应用程序之间实现IPC 我尝试使用WWSAPIs,并在上遵循示例以实现相同的效果。正如MSDN参考中提到的,NetNamedPipeBinding可用于WWSAPI,并随Windows 8 SDK一起提供 下面是我的C#控制台应用程序的代码示例非托管C和x2B之间的IPC+;并使用WCF和WWSAPI管理C#应用程序,c#,wcf,visual-c++,ipc,wwsapi,C#,Wcf,Visual C++,Ipc,Wwsapi,我想在非托管VC++COM Excel加载项和托管C#控制台应用程序之间实现IPC。目前,我使用NetNamedPipeBinding在maanged C#应用程序之间实现IPC。我现在想使用NetNamedPipeBinding在非托管和托管应用程序之间实现IPC 我尝试使用WWSAPIs,并在上遵循示例以实现相同的效果。正如MSDN参考中提到的,NetNamedPipeBinding可用于WWSAPI,并随Windows 8 SDK一起提供 下面是我的C#控制台应用程序的代码示例 Uri b
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创建所需的头文件。但是,当我尝试创建头文件时,会收到以下警告:
警告WSUTIL0089在中未找到支持的策略设置
输入元数据。服务可能正在使用绑定配置,而不是
WWSAPI支持,如消息安全设置。看见
WWSAPI支持的配置列表的文档
现在,如果我将C#控制台应用程序中的绑定类型更改为WSHttpBinding或NetTcpBinding,那么我就能够使用WsUtil成功地创建头文件
我无法使用WsHttpBinding,因为启动服务需要管理权限,并且我的托管应用程序通常会使用非管理权限运行。我还在MSDN上读到,网络命名管道绑定针对同一台机器上的IPC进行了优化,这在理想情况下就是我的情况
如果需要,我可以共享我的unangangeC++和管理C的示例代码。
<>对非托管C++与托管C语言之间的NETAMEDIN绑定的任何帮助都将被理解为
注意:我无法将我的非托管VC++COM加载项移植到托管VSTO应用程序中您可以编辑主WSDL文件并更改
soap12:binding transport=”吗http://schemas.microsoft.com/soap/named-pipe“/>
行。只需将命名管道
替换为tcp
。Wsutil现在应该可以工作了,但是您可以使用当时生成的内容吗?
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();