.net 引用的dll-dll文件名是否重要?
我希望在我自己引用的程序集中包含用于分发目的的dll名称版本控制。例如,MyGreat.dll变为MyGreat.v2.dll 所有MyGreat.dll版本(包括MyGreat.v.x.x.dll)中的名称空间都是MyGreat 在VisualStudio中,我可以添加对任意一个文件名的引用,并且它可以毫无问题地生成。使用文件名MyGreat.dll作为引用的dll,VS在调试模式下运行良好 当我在调试模式下使用MyGreat.v.2.dll作为引用的dll运行VS时,我得到一个错误,它找不到MyGreat.dll或它的一个依赖项等 我可以在VisualStudio对象浏览器窗口中使用任一命名dll浏览dll 我已经尝试了尽可能多的组合和可能性,包括“或其依赖之一”,并清理项目 有什么想法吗 编辑:fuslogvw结果为:.net 引用的dll-dll文件名是否重要?,.net,visual-studio,dll,.net,Visual Studio,Dll,我希望在我自己引用的程序集中包含用于分发目的的dll名称版本控制。例如,MyGreat.dll变为MyGreat.v2.dll 所有MyGreat.dll版本(包括MyGreat.v.x.x.dll)中的名称空间都是MyGreat 在VisualStudio中,我可以添加对任意一个文件名的引用,并且它可以毫无问题地生成。使用文件名MyGreat.dll作为引用的dll,VS在调试模式下运行良好 当我在调试模式下使用MyGreat.v.2.dll作为引用的dll运行VS时,我得到一个错误,它找不到
*** Assembly Binder Log Entry (24/07/2015 @ 6:20:12 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable E:\My Projects\MyProject\bin\Debug\MyProject.vshost.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = MyProject.resources, Version=14.0.2.1, Culture=en-GB, PublicKeyToken=d0c57861bf8e7fbf
(Fully-specified)
LOG: Appbase = file:///E:/My Projects/MyProject/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = MyProject.vshost.exe
Calling assembly : MyProject, Version=14.0.2.1, Culture=neutral, PublicKeyToken=d0c57861bf8e7fbf.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\My Projects\MyProect\bin\Debug\MyProject.vshost.exe.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: MyProject.resources, Version=14.0.2.1, Culture=en-GB, PublicKeyToken=d0c57861bf8e7fbf
LOG: The same bind was seen before, and was failed with hr = 0x80070002.
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
EndEdit您试图做的事情并非不可能,但很容易出错。请注意您是如何查看错误的Fuslogvw.exe跟踪的。此处重要的设置是类库项目中的“项目>属性>应用程序”选项卡: 程序集名称是使用该程序集的其他项目在其元数据中嵌入的名称。双击清单可以看到ildasm.exe中的内容:
.assembly extern 'ClassLibrary1.v1.2.3.5'
{
.ver 1:2:3:5
}
在文件名中嵌入版本号的任何其他操作(如重命名磁盘上的文件)都会导致您描述的问题
使用带有对类库的项目引用的解决方案也是非常非常重要的。如果不使用并使用文件引用,则更改程序集名称将中断任何使用类库的项目,您必须删除引用并将其重新添加
重新发明GAC也许不是最好的主意。请注意它如何以不同的方式处理此问题,请看c:\windows\microsoft.net\assembly with Explorer,它将程序集存储在一个文件夹中,该文件夹的名称取决于版本号。我不确定您是否真的用此创建了价值。即使使用Windows资源管理器,也可以看到版本信息。那么为什么要在名称中添加版本信息呢?项目中有多个应用程序,它们经常引用同一个dll。更新一个应用程序时,为该应用程序分发新版本的dll会变得复杂,因为它们都添加到GAC中。还有其他选择吗?“可以在全局程序集缓存中维护具有相同名称但不同版本信息的程序集的多个副本。”GAC被设计为走出DLL地狱的途径。(")