Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何绕过.NET DLL服务引用要求_C#_.net_Vb.net_Web Services_Dll - Fatal编程技术网

C# 如何绕过.NET DLL服务引用要求

C# 如何绕过.NET DLL服务引用要求,c#,.net,vb.net,web-services,dll,C#,.net,Vb.net,Web Services,Dll,我在.NET中有一个DLL,它使用Web服务发送电子邮件 当我在项目中使用DLL时,它会给我一个错误,除非我再次引用Web服务 我不想被强迫在使用DLL的父项目中引用它 要调用DLL,我只需执行以下操作: Try Dim x As New clsMail Dim y As New clsMail.objMail x.SendEmail(y) Catch ex As Exception e = ex.ToString End Try 这是否可能,因为它已在DLL中

我在.NET中有一个DLL,它使用Web服务发送电子邮件

当我在项目中使用DLL时,它会给我一个错误,除非我再次引用Web服务

我不想被强迫在使用DLL的父项目中引用它

要调用DLL,我只需执行以下操作:

Try
    Dim x As New clsMail
    Dim y As New clsMail.objMail
    x.SendEmail(y)
Catch ex As Exception
    e = ex.ToString
End Try
这是否可能,因为它已在DLL中引用

如果我删除了主项目中的引用,我会从公共DLL中得到一个错误。如果我将服务引用添加到主项目,那么错误就会消失

我想能够使用这个DLL和服务,只导入DLL而不必做任何额外的工作。关键是能够将此DLL导入到许多项目中,而无需在这些项目中执行任何额外步骤

提前谢谢

最后更新:

添加MailServer=New MailServer.Service1SoapClientNew BasicHttpBinding,New EndpointAddress 在DLL中,它本身修复了这个问题。我现在可以在任何项目中使用,而不必引用DLL之外的Web服务

C版本:

 MailServer.Service1SoapClient MailServer = new MailServer.Service1SoapClient(new BasicHttpBinding(), new EndpointAddress("http://webmail/SendEmail.asmx"));

谢谢

我建议创建一个带有通用代码的层,该层将通过所有解决方案共享

例如,screenshot.common,然后在common中引用服务,因此您只需要在单个位置引用服务。然后,只要您需要通用代码,就可以参考screenshot.common


我希望有帮助

您可能不需要添加整个服务引用。添加引用所做的唯一有益的事情是在App.config中为您的程序添加设置,您不需要它生成的任何文件或类。您只需将WizardCommunications中自动生成的app.config中的配置设置复制到屏幕截图中的app.config中即可。然后,它将从exe的配置文件中读取设置,应该可以工作

您还可以使用允许您传入URL的构造函数将设置(如它连接到的URL)从app.config手动硬编码到您的库中,这样它就不会依赖配置进行设置

更新:

要硬编码设置,而不是将Dim MailServer用作新的MailServerClient,并在部分公共类Service1SoapClient中使用构造函数Public Sub New,您需要将Public Sub NewByVal绑定用作System.ServiceModel.Channels.binding,将ByVal remoteAddress用作System.ServiceModel.EndpointAddress构造函数

为此,您需要在dll中重新创建app.config文件中定义的设置,并将其作为两个参数传入。这是一个基本的例子,你需要调整它以适应你的需要

Dim MailServer As New MailServer.Service1Client(New BasicHttpBinding(), New EndpointAddress("http://webmail/SendEmail.asmx"))

一旦您这样做了,您就可以引用项目的dll,而不需要运行exe的app.config中的任何内容

不确定这将如何解决在多个解决方案中使用此dll而不在每个解决方案中添加服务的问题。基本上,我们的想法是将服务引用放在一个地方,然后在需要的地方引用服务引用的dll。从我的观点来看,这将让您创建一个良好的解耦,因为如果它是一个WCF,例如,所有类都将位于一个位置,您只需要引用DLL,就可以访问这些类,只需要在项目中添加所需的配置,在项目中使用这些类和服务。如果我启动一个新项目,请说Test1。我需要重新做一遍吗?不,因为如果你开始一个新的解决方案,你可以添加现有的项目,因此,您需要一个公共dll,可以在您需要的每个项目中重用。公共dll实际上是图片中的通信dll不确定如何解决在多个解决方案中使用此dll而不在每个解决方案中添加服务的问题。它解决了问题,因为错误无法找到默认的端点元素引用ServiceModel客户端配置部分中的约定“MailServer.Service1Soap”。这可能是因为找不到应用程序的配置文件,或者因为在客户端元素中找不到与此约定匹配的端点元素,这意味着它缺少正在运行的exe的App.config中的设置。如果您将配置从dll的app.config中自动生成的配置复制到exe的app.config,您的程序将正常工作。但我需要在使用通信dll的每个解决方案中执行此操作。我想绕过所有这些,只需要添加对DLL的引用,并完成它。这不是dll工作的问题,我已经做到了。我只想删除额外的步骤。主要是因为我们将在其他项目中循环使用此DLL,因此添加这些隐藏引用将是一件麻烦事,在这种情况下,请使用允许您传递URL的构造函数,而不是默认构造
或者当你创建你的服务时。你能举个例子吗?你应该发布准确的错误。是否通过“服务访问”程序集公开服务定义的类型?确定:如果从快照中删除服务,则在ServiceModel客户端配置部分中找不到引用约定“MailServer.Service1Soap”的默认终结点元素。这可能是因为找不到应用程序的配置文件,或者在客户端元素中找不到与此约定匹配的端点元素。仅供参考,您没有使用WebService,而是使用WCF服务。WebService是一个类似但不同的reference.vb文件。也许,但端点以ASMX结尾。我认为这不是wcf