我有一个解决方案,简单地说,它包含一个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建议的那样,旧的程序集名称仍然出现在序列化数据文件中,所以当我尝试从程序中加载它时,我得到一个例外,因为它无法在序列化中找到引用的程序集文件的
答案 0 :(得分:4)
我假设您在程序中使用standart .NET serialization
。请记住,在中类序列化.NET
也会保存类型信息。带名称空间的完整类型信息。这意味着如果您更改程序集名称并重新编译完整类型名称将导致不匹配。
如果这不是您正在做的事情,请澄清。