我的代码不使用引用的程序集,因为我们决定使用内部邮件。
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没有强名称(即没有使用只有原始开发人员拥有的私钥签名)时,这才有效。