删除程序集绑定而不重新生成



我的代码不使用引用的程序集,因为我们决定使用内部邮件。

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=0x8007002。

为什么代码试图在程序集执行之前加载程序集。

是否可以删除程序集而不删除代码并重新生成?类似于在web.config中删除程序集/重定向之类的内容

更新:

尝试使用具有相同方法签名和伪实现的伪程序集,但没有运气

在bin \ fake文件夹中放置了一个伪伪程序集

<runtime>   
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="3rdParty" />
<codeBase version="1.0.0.0" href="Fake3rdParty.dll" />
</dependentAssembly>     
</assemblyBinding>
</runtime>

将引用dll的代码移动到另一个永远不会被调用的方法。例如

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);
} 
}

出现此错误的原因是,运行时在调用每个方法之前对其进行编译,并且需要编译完整的方法。通过将引用移动到另一个方法,运行时可以编译SendMail消息。

当您完全无法更改代码时,另一种选择是提供假程序集。此程序集需要具有相同的名称,并且需要导出项目使用的所有类型和方法,但不需要实现它们。

只有当当前使用的第三方Dll没有强名称(即没有使用只有原始开发人员拥有的私钥签名)时,这才有效。

最新更新