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

我有一个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后缀的程序集。

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

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

不幸的是,你只能通过重命名程序集来实现这一点。

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

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

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

您可以通过编辑引用的程序集的项目文件来解决此问题。 您可以通过右键单击解决方案资源管理器中项目属性并选择卸载项目来执行此操作 。 然后右键单击卸载的项目并选择编辑项目 。 将其粘贴到第一个标记ItemGroup之前

  ...  $(AssemblyName)d   ... 

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

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