4

我想在非托管 VC++ COM Excel 插件和托管 C# 控制台应用程序之间实现 IPC。目前,我使用 NetNamedPipeBinding 在管理的 C# 应用程序之间实现 IPC。我现在想使用 NetNamedPipeBinding 在非托管和托管应用程序之间实现 IPC。

我尝试使用 WWSAPI 并按照CodeProject中的示例来实现相同的目的。如 MSDN 参考链接 1 、链接 2 和链接 3 中所述,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 创建所需的头文件。但是,当我尝试创建头文件时,我收到以下警告:

警告 WSUTIL0089 在输入元数据中找不到受支持的策略设置。该服务可能正在使用 WWSAPI 不支持的绑定配置,例如消息安全设置。有关 WWSAPI 支持的配置列表,请参阅文档。

现在,如果我将 C# 控制台应用程序中的绑定类型更改为 WSHttpBinding 或 NetTcpBinding,那么我可以成功地使用 WsUtil 创建头文件。

我不能使用 WsHttpBinding,因为它需要管理权限才能启动服务,并且通常我的托管应用程序将使用非管理权限运行。我还在 MSDN 上读到 Net Named Pipe Binding 已针对同一台机器上的 IPC 进行了优化,这是我的理想情况。

如果需要,我可以共享我的非托管 C++ 和托管 C# 的示例代码。

任何有关在非托管 C++ 和托管 C# 之间实现 NetNamedPipeBinding 的帮助将不胜感激

PS:我无法将我的非托管 VC++ COM 插件移植到托管 VSTO 应用程序

4

0 回答 0