我有一个解决方案,简单地说,一个 Windows 窗体应用程序项目和一个类库,两者都用 C# 编写。我的图书馆项目名为OldName
. 因此命名空间也是OldName
,生成的文件是OldName.dll
.
我想更改名称,所以我进入属性,并将程序集名称从 更改OldName
为NewName
。
构建现在生成一个NewName.dll
. 然而,当我的应用程序试图访问这个 dll 时,我得到了一个System.Runtime.Serialization.SerializationException
(dll 包含我对某些东西进行二进制序列化的方法):它声称Unable to find assembly 'OldName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Procmon.exe 确认它正在寻找旧的 dll ( NAME NOT FOUND
)。
现在奇怪的是,如果我复制 并将其NewName.dll
重命名为OldName.dll
,这样我就有了OldName.dll
,NewName.dll
问题仍然存在。如果我删除NewName.dll
并只离开OldName.dll
,程序在启动时崩溃:System.IO.FileNotFoundException: Could not load file or assembly 'NewName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
这一次,Procmon.exe 报告它在因为上的CreateFileMapping
操作失败,但它似乎在.OldName.dll
FILE LOCKED WITH ONLY READERS
NewName.dll
将程序集名称改回以OldName
修复所有问题,但当然文件名变成了OldName
我不想要的。
我一生都无法弄清楚它在哪里引用了旧的程序集名称。我会错过什么?
解决方案:我的程序允许用户创建一个文件,然后使用我的 dll 中的方法使用序列化将其保存到磁盘。它还允许加载文件。懒得做了一次测试文件,一直重复使用。事实证明,正如@Tigran 所建议的那样,旧的程序集名称仍然出现在序列化数据文件中,所以当我试图从我的程序中加载它时,我遇到了一个异常,因为它找不到序列化文件中引用的程序集。