忍受我一会儿,我想布置整个画面。 我有一个WPF应用程序(.exe),它需要在COM对象(VB6宏)调用应用程序方法时打开并显示一个窗口。我已经在.exe解决方案COM中创建了一个托管代码项目,VB6宏成功调用了此托管代码项目(COM存根)上的方法。
我的COM存根接收方法调用并在第一次传递命令行参数的WPF exe上运行Process.Start。我的应用程序按预期启动。我现在需要通过我的COM存根从VB6宏发送数据,并在连续调用时发送到WPF exe。我在我的WPF exe解决方案中添加了一个WCF项目,生成了“netNamedPipeBinding”服务。我在COM存根中添加了一个ServiceReference来与WPF exe进行通信。我已经使用控制台应用程序单独测试了WCF服务,但它确实有效。我使用与我的测试用例相同的元数据地址构建了COM存根ServiceReference,并且它正常构建了引用。
我的测试驱动程序调用COM存根方法并启动WPF应用程序。我对COM存根的下一次调用尝试实例化服务客户端,我得到了可怕的错误: “无法在ServiceModel客户端配置部分找到名称为'internal'且收缩'SelectedStudentReference.ISelectedStudent'的端点元素。”
以下是我在WPF exe解决方案的WCF服务项目部分中的app.config的内容。
<system.serviceModel>
<bindings />
<client />
<services>
<service name="AwardManager.Service.SelectedStudentService">
<host>
<baseAddresses>
<!--<add baseAddress = "http://localhost:8080/SelectedStudent" />-->
<add baseAddress="net.pipe://localhost/SelectedStudent" />
</baseAddresses>
</host>
<endpoint
name="internal"
address="net.pipe://localhost/"
binding="netNamedPipeBinding"
contract="AwardManager.Service.ISelectedStudent"
/>
<endpoint
address="mex/pipes"
binding="mexNamedPipeBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="False"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我已经尝试将其复制到WPF app.config中,但没有成功。此服务适用于控制台应用程序测试驱动程序。由于这是我第一次使用WCF,我对下一个故障排除步骤感到茫然。我看了another Stackflow question,但无法弄清楚它是否适用于我的情况。有什么想法吗?
答案 0 :(得分:0)
它总是你看的最后一个地方。我的控制台应用程序测试驱动程序正在调用带有ServiceReference的COM存根。我在创建ServiceClient的调用之前添加了这行代码。
string dir = System.IO.Directory.GetCurrentDirectory();
这表明客户端是在测试驱动程序目录中创建的。我将这个从我的COM存根复制到测试驱动程序的app.config中。现在就像一个冠军。
<system.serviceModel>
<bindings>
<netNamedPipeBinding>
<binding name="internal" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport protectionLevel="EncryptAndSign" />
</security>
</binding>
</netNamedPipeBinding>
</bindings>
<client>
<endpoint
address="net.pipe://localhost/"
binding="netNamedPipeBinding"
bindingConfiguration="internal"
contract="SelectedStudentReference.ISelectedStudent"
name="internal">
<identity>
<userPrincipalName value="me@xyz.com" />
</identity>
</endpoint>
</client>
</system.serviceModel>
答案 1 :(得分:0)
这导致我的解决方案:将服务引用内容移动到'main'app.config文件,然后可以通过'child'(wpf)项目找到它。