删除装配绑定而不重建

时间:2016-06-01 15:24:43

标签: c# .net .net-assembly

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

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>

2 个答案:

答案 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没有强名称(即未使用只有原始开发人员的私钥签名)。