加载重命名的C#程序集抛出FileNotFoundException

时间:2011-04-12 19:49:08

标签: c#

我有一个由C#应用程序引用的C#程序集。

由于我们的编码标准,有一条规则,其中调试DLL后缀为“d”(例如ProjectA.dll变为ProjectAd.dll)。当我将重命名的DLL的引用添加到应用程序时,它会成功构建,但在执行时抛出FileNotFoundException

抛出的错误如下:

System.IO.FileLoadException: Could not load file or assembly 'ProjectA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=49df7f988e86ed92' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) File name: 'ProjectA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=49df7f988e86ed92'

程序集管理器也会发出警告和错误:

WRN: Comparing the assembly name resulted in the mismatch: PUBLIC KEY TOKEN
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

从错误消息中,看起来它正在寻找没有d后缀的程序集。

BTW,有一个由同一个应用程序引用的C ++ / CLI程序集。它附加了d,但在VS2005中查看引用的属性表明安全标识已正确附加d。 C#引用在属性窗口中附加了d

要使调试C#程序集正常工作,我该怎么办?我已经尝试修改AssemblyInfo.cs中的条目无济于事。这是清单文件可以解决的问题吗?

1 个答案:

答案 0 :(得分:13)

Unfotunately你只能通过重命名程序集来实现这一点。

程序集的名称通过编译写入其元数据中。当您稍后更改其文件名时,实际上并未更改其元数据中的名称。

然后通过第二次编译,将从其元数据中读取引用程序集的名称并将其写入新构建的程序集。

在运行时,CLR将在引用程序集的元数据的名称int上搜索引用的程序集。但是,它不会在任何探测路径中找到它,因此会抛出异常FileNotFound。

您可以通过编辑引用的程序集的项目文件来解决此问题。您可以通过右键单击解决方案资源管理器中的项目属性并选择卸载项目来实现。然后右键单击卸载的项目并选择编辑项目。在第一个标签ItemGroup

之前粘贴此项
  ... 
  <PropertyGroup>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">$(AssemblyName)d</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
  ...

这是msbuild脚本的条件AssemblyName属性。仅当您将配置设置为Debug值时才会应用它,并将采用上面定义的AssemblyName并向其添加“d”。

现在,您将在文件名和元数据中使用名称“d”。当您更改回Release配置时,将省略该属性。