C# 删除部件绑定而不重新生成
我的代码不使用引用的程序集,因为我们决定使用内部邮件C# 删除部件绑定而不重新生成,c#,.net,.net-assembly,C#,.net,.net Assembly,我的代码不使用引用的程序集,因为我们决定使用内部邮件 public static class Helper { public static bool UseInternalMail { get { return Convert.ToBoolean( ConfigurationManager.AppSettings["UseInternalMail"].ToString();
public static class Helper
{
public static bool UseInternalMail
{
get
{
return Convert.ToBoolean(
ConfigurationManager.AppSettings["UseInternalMail"].ToString();
}
}
public static void SendMail(string message)
{
if(UseInternalMail){
//do via local SMTP
}
else{
//Call a method in 3rd Party assembly, no more using
3rdPartyDll.Send(message);
}
}
}
现在我们不再使用第三方DLL。所以我已经从IIS中托管的网站的bin文件夹中删除了这个dll
我们得到了错误
无法加载文件或程序集“3rdPartyDll”
==预绑定状态信息===
日志:DisplayName=3rdPartyDll,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null
(详细说明)
日志:Appbase=file:///C:/Client/Web/MyWebsite/
日志:初始PrivatePath=C:\Client\Web\MyWebsite\bin
调用程序集:MyWebsite,版本=2.0.0.1,区域性=中性
日志:此绑定在默认加载上下文中启动。
日志:使用应用程序配置文件:C:\Client\Web\MyWebsite\Web.config
日志:使用主机配置文件:
日志:使用c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config中的计算机配置文件。
日志:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。
日志:以前看到过相同的绑定,但由于hr=0x80070002而失败
为什么代码试图在程序集被执行之前加载程序集
是否可以在不删除代码并重新生成的情况下删除程序集?类似于在web.config中删除程序集/重定向?
更新:
尝试使用具有相同方法签名和虚拟实现的假程序集,但没有成功
在bin\fake文件夹中放置了伪伪程序集
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="3rdParty" />
<codeBase version="1.0.0.0" href="Fake\3rdParty.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
将引用dll的代码移动到另一个永远不会调用的方法。 例如
出现此错误的原因是,运行库在调用每个方法之前对其进行编译,并且需要编译完整的方法。通过将引用移动到另一个方法,运行时可以编译SendMail消息 当您绝对无法更改代码时,另一种选择是提供一个伪程序集。此程序集需要具有相同的名称,并且需要导出项目使用的所有类型和方法,但不需要实现它们
这仅在当前使用的3rdPartyDll没有强名称(即未使用只有原始开发人员拥有的私钥进行签名)时有效。为什么不使用删除的程序集/引用重新编译代码,然后将代码重新部署到web服务器,并确保web.config文件中没有引用。在IIS的本地实例上对其进行本地测试,并查看在删除引用后问题是否得到解决。另外,如果您不再使用
3rdPartyDll
,那么为什么仍要在代码中调用它。@MethodMan,源代码有许多新的更改,未经测试。因此,我们不能只是构建和替换代码:(但我们要求删除该程序集听起来您的测试策略是有缺陷的。)您可以在将新构建推向生产之前对其进行全面回归测试。您还希望它如何工作或发现它是否不工作?。您只需创建一个新方法并创建一个静态Utils类,以及所有您拥有的public Static void SendMail(string message)
在助手类中,您可以添加一个名为SendMailNew(string message)的新方法
并在您的代码中进行全局搜索,在调用SendMail
的每个位置进行查找并替换为SendNewMail
,因为它将具有与版本控制相同的方法签名。返回到当前使用的生成所使用的源代码版本,在那里进行更改并创建新的生成d仅更改邮件的发送方式(根据sgmoore的建议)。如果您不进行版本控制,那么现在是开始的时候了。我们无法进行代码更改,除了web.config更改,除非我遗漏了一些内容,否则这与OP的原始代码没有什么区别。如果是这样,而且他们不想调用第三方DLL,不管它是否保留在编译代码中,我会在配置文件中设置key to使用InternalMail并将其设置为true,这样它将始终使用更新的代码。这是一个更快的解决方案well@MethodMan不同之处在于,当前代码要求dll在调用SendMail之前存在,因此在对UseInternalMail求值之前存在。我的方法只有在调用SendUsing3rdPartyDl时才需要dlll方法。是的,它确实起到了作用。有没有其他方法可以告诉编译器通过配置忽略这个问题?@MuraliMurugesan如果你不能更改代码,那么NineBerry的建议可能是你最好的选择。是的。它没有任何公共ket令牌等。我正试图通过对AssemblyBindings使用
来做类似的事情,只要把bin文件夹中的假程序集,因此运行时可以找到它。我最终得到了假程序集解决方案。谢谢
public static class Helper
{
public static void SendMail(string message)
{
if(UseInternalMail)
{
//do via local SMTP
}
else
{
//Call a method in 3rd Party assembly, no more using
SendUsing3rdPartyDll(message);
}
}
private void SendUsing3rdPartyDll(message)
{
3rdPartyDll.Send(message);
}
}