在过去的几周里,我开发了一个64位WinForms应用程序,它需要与32位DLL进行通信(作业规范要求)。
在做了一些阅读周围的互联网,并发现不会有任何有趣的方式来做到这一点,我决定去与托管一个WCF服务应用程序在我的WinForms应用程序通信到32位DLL.至少我是这么想的
在开发期间(在Visual Studio中运行时),它一直运行得很好,但是当然,现在我需要部署,我遇到了问题。我很难对WCF服务有足够强的理解,不知道我是在以一种可怕的方式进行这件事,还是我只是错过了一些微小的细节。
我创建了这个项目作为管理员。开发完成后,我尝试运行WinForm可执行文件(调试和发布)WindowsFormsApplication1.exe。应用程序启动了,但在我试图完成一个涉及使用WCF服务的任务后,抛出了一个异常:
这让我相信Visual Studio在开发过程中托管了服务,而不是WinForm应用程序,或者我的目录和/或目录结构不正确。
[已删除] WCF服务Web.config:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" maxRequestLength="2147483647"/>
</system.web>
<system.net>
<defaultProxy>
<proxy usesystemdefault="False"/>
</defaultProxy>
</system.net>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true" >
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="myUserTraceSource"
switchValue="Information, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\logs\Traces.svclog" />
</sharedListeners>
</system.diagnostics>
<system.serviceModel>
<diagnostics wmiProviderEnabled="true">
<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="3000"
/>
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="metadadiscovery>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="ServiceReference1.Service1" behaviorConfiguration="metadadiscovery">
<endpoint address="" binding="basicHttpBinding" contract="ServiceReference1.IService1"></endpoint>
</service>
</services>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="false"/>
</system.webServer>
</configuration>
WinForm App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService2" />
<binding name="BasicHttpBinding_IService3" />
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:45053/Service2.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference2.IService2"
name="BasicHttpBinding_IService2" />
<endpoint address="http://localhost:46351/Service3.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService3" contract="ServiceReference3.IService3"
name="BasicHttpBinding_IService3" />
<endpoint address="http://localhost:44848/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
<appSettings>
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
EXE驻留的目录:
包含WCF服务的目录位于上图中的目录WcfService 1中。
我主要使用以下方法示例化服务:
ServiceReference1.Service1Client = new ServiceReference1.SErvice1Client();
有一次,我试图切换到使用服务主机(如下所示),但当我使用该方法时,服务将超时,每当它试图与DLL通信。
Uri address = new Uri("http://localhost:44848/Service1.svc");
ServiceHost host = new ServiceHost(typeof(ServiceReference1.Service1Client), address);
host.Open();
然后我关闭了主机。在这一点上,我愿意尝试任何事情来让它工作。
[编辑]下面是我的WindowsFormsApplication1.exe.config文件的代码。所有三个合约都给出了警告,即它们“根据其数据类型'clientContractType'无效”。我认为这可能是我的问题的根源,但我不知道为什么它显示这个警告:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService2" />
<binding name="BasicHttpBinding_IService3" />
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:45053/Service2.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference2.IService2" name="BasicHttpBinding_IService2" />
<endpoint address="http://localhost:46351/Service3.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService3" contract="ServiceReference3.IService3" name="BasicHttpBinding_IService3" />
<endpoint address="http://localhost:44848/Service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
感谢您提供的任何帮助和指导。
2条答案
按热度按时间sgtfey8w1#
没有为您的服务配置终结点。
上面我已经为Service2配置了,同样地,你必须为Service1和Service3配置。
toiithl62#
经过充分的努力,我决定摆脱WCF服务,当你创建一个新项目时,Visual Studio会为你生成它。相反,我逐字逐句地遵循了这个教程:
Hosting Service In App
这样做有巨大的好处:
1.不需要配置文件
1.以这种方式运行它一定已经摆脱了大量的开销,因为与DLL的通信(我使用该服务的目的)过去需要几秒钟才能对DLL进行大量调用,但现在能够在眨眼之间处理10k+调用。
1.不需要服务引用。我只需要主函数的文件、包含服务函数实现的文件和包含实现接口的文件。
到目前为止,这是我发现的在64位应用程序中使用32位DLL的最简单和最健壮的方法。让我知道,如果我可以给给予任何指导,为任何其他人谁可能是挣扎与这个问题。我知道这不是一个有趣的事情来处理如果你从来没有做过这样的事情之前。