由于我们决定使用内部邮件,因此我的代码不会使用引用的程序集。
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);
}
}
}
现在我们不再使用3rdPartyDll了。所以我已经从我在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,Version = 2.0.0.1,Culture = neutral,
日志:此绑定在默认加载上下文中启动。 日志:使用应用程序配置文件: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>
答案 0 :(得分:2)
将引用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);
}
}
您收到此错误的原因是因为运行时在调用它之前编译每个方法,并且需要编译complete方法。通过将引用移动到另一个方法,运行时可以编译SendMail消息。
答案 1 :(得分:1)
当您绝对无法更改代码时,另一种方法是提供假装配。此程序集需要具有相同的名称,并且需要导出项目使用的所有类型和方法,但不需要实现它们。
这仅适用于当前使用的3rdPartyDll没有强名称(即未使用只有原始开发人员的私钥签名)。