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

Soo*_*Tan 10 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后缀的程序集.

顺便说一句,有一个由同一个应用程序引用的C++/CLI程序集.它d附加到DLL,但在VS2005中查看引用的属性表明安全标识已d正确附加.C#的文献并没有具有d在属性窗口追加.

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

Hon*_*scz 13

不可思议的是,你只能通过重命名程序集来实现这一点.

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

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

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

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

  ... 
  <PropertyGroup>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">$(AssemblyName)d</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
  ...
Run Code Online (Sandbox Code Playgroud)

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

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