【问题标题】:VS2010 Can't find assembly after it is renamedVS2010 重命名后找不到程序集
【发布时间】: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.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 报告它在OldName.dll 上的CreateFileMapping 操作失败,因为FILE LOCKED WITH ONLY READERS,但似乎在NewName.dll 上得到同样的结果。

将程序集名称改回OldName 可以解决所有问题,但当然文件名会变为OldName,我不希望这样。

我一辈子都想不通它在哪里引用了旧的程序集名称。我可能会错过什么?

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

【问题讨论】:

标签: c# visual-studio-2010 clr .net-assembly filenotfoundexception


【解决方案1】:

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

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

【讨论】:

  • 你说得对。这解决了问题 - 我用详细信息编辑了我的问题。
  • @Superbest:谢谢你给了我有用的感觉:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2014-06-03
  • 2021-06-03
相关资源
最近更新 更多