加载重命名的C#程序集会引发FileNotFoundException

加载重命名的C#程序集会引发FileNotFoundException,c#,C#,我有一个C#程序集,它被C#应用程序引用 由于我们的编码标准,有一条规则规定调试dll以“d”后置(例如,ProjectA.dll变成ProjectAd.dll)。当我向应用程序添加对重命名DLL的引用时,它成功构建,但在执行时抛出FileNotFoundException 引发的错误如下所示: System.IO.FileLoadException:无法加载文件或程序集“ProjectA,版本=1.0.0,区域性=中性,PublicKeyToken=49df7f988e86ed92”或其依赖项

我有一个C#程序集,它被C#应用程序引用

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

引发的错误如下所示:

System.IO.FileLoadException:无法加载文件或程序集“ProjectA,版本=1.0.0,区域性=中性,PublicKeyToken=49df7f988e86ed92”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常:0x8013100)
文件名:“ProjectA,版本=1.0.0.0,区域性=neutral,PublicKeyToken=49df7f988e86ed92”

assembly manager还会发出警告和错误:

WRN:比较程序集名称导致不匹配:公钥令牌
错误:未能完成程序集的设置(hr=0x8013100)。探测终止。

从错误消息看,它似乎正在查找没有后缀的程序集

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


要使调试C#程序集正常工作,我必须做些什么?我已尝试修改AssemblyInfo.cs中的条目,但无效。这是清单文件可以解决的问题吗?

unfotunaelly仅通过重命名程序集无法实现这一点

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

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

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

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

  ... 
  <PropertyGroup>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">$(AssemblyName)d</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
  ...
。。。
$(AssemblyName)d
...
这是msbuild脚本的条件AssemblyName属性。仅当您将配置设置为“调试”值,并且将采用上面定义的AssemblyName并向其中添加“d”时,才会应用该选项


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

请参见此处:您可以尝试使用反射检查给定目录中的所有程序集,然后选择实现所需类型的程序集。在这一点上,DLL名称是什么并不重要。您是否尝试过进行清理和重建?如果是web应用程序,请尝试删除“临时ASP.NET文件”的内容。我以前在重命名程序集时看到过这个错误,并让上面的一个修复了它。非常感谢您的回答!你的解决方案对我非常有效!