【发布时间】:2012-04-07 13:17:07
【问题描述】:
我有一个解决方案,简单地说,包括一个 Windows 窗体应用程序项目和一个类库,两者都用 C# 编写。我的图书馆项目被命名为OldName。因此命名空间也是OldName,生成的文件是OldName.dll。
我想更改名称,所以我进入属性,并将程序集名称从 OldName 更改为 NewName。
Building 现在生成一个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 报告它在OldName.dll 上的CreateFileMapping 操作失败,因为FILE LOCKED WITH ONLY READERS,但似乎在NewName.dll 上得到同样的结果。
将程序集名称改回OldName 可以解决所有问题,但当然文件名会变为OldName,我不希望这样。
我一辈子都想不通它在哪里引用了旧的程序集名称。我可能会错过什么?
解决方案:我的程序允许用户创建一个文件,然后使用我的 dll 中的方法使用序列化将其保存到磁盘。它还允许加载文件。懒得做了一次测试文件,一直重复使用。事实证明,正如@Tigran 所建议的那样,旧的程序集名称仍然出现在序列化数据文件中,所以当我尝试从我的程序中加载它时,我遇到了一个异常,因为它在序列化中找不到引用的程序集 文件。
【问题讨论】:
-
如何使用序列化?二进制、xml、数据合约?这个问题的答案我帮你:stackoverflow.com/questions/950992/…
标签: c# visual-studio-2010 clr .net-assembly filenotfoundexception