我有一个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配置时,将省略该属性.