3

我有一个解决方案,简单地说,一个 Windows 窗体应用程序项目和一个类库,两者都用 C# 编写。我的图书馆项目名为OldName. 因此命名空间也是OldName,生成的文件是OldName.dll.

我想更改名称,所以我进入属性,并将程序集名称从 更改OldNameNewName

构建现在生成一个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.dllNewName.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.dllFILE LOCKED WITH ONLY READERSNewName.dll

将程序集名称改回以OldName修复所有问题,但当然文件名变成了OldName我不想要的。

我一生都无法弄清楚它在哪里引用了旧的程序集名称。我会错过什么?

解决方案:我的程序允许用户创建一个文件,然后使用我的 dll 中的方法使用序列化将其保存到磁盘。它还允许加载文件。懒得做了一次测试文件,一直重复使用。事实证明,正如@Tigran 所建议的那样,旧的程序集名称仍然出现在序列化数据文件中,所以当我试图从我的程序中加载它时,我遇到了一个异常,因为它找不到序列化文件中引用的程序集。

4

1 回答 1

5

在你的程序中你使用standart .NET serialization. 请记住,在这种序列化中也.NET保存了类型信息。完整的类型信息,带有命名空间。这意味着如果您更改程序集名称并重新编译完整的类型名称将不匹配。

如果这不是你正在做的,请澄清。

于 2012-04-07T13:20:14.977 回答