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