我有一个针对.NETFramework 4.0(使用强名)的程序集(MYASM.dll)
我想以某种方式将该程序集部署为目标计算机上.NETFramework的一部分(或整个系统认为它是)。
我的意思是:
Model.CategoryID = Model.categoryModel[selectedIndex].ID;
时,MSBuild无需提示路径即可看到它<Reference Include="MYASM" />
,并且引入Add reference
时无需使用强/全名通过将其添加到GAC,我已经解决了1.(显然是2.)。但这显然是不够的。
通过将程序集放在特殊文件夹(<Reference Include="MYASM" />
)中并设置RegistryKey [INSTALLFOLDER]\lib
然后我可以添加引用,但是我得到:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0\AssemblyFoldersEx\MyAssemblies
在我的csproj中,而不仅仅是我想要的<Reference Include="MYASM, Version=1.1, Culture=neutral, ..." />
。
使用第二种方法,如果我手动编辑csproj,一切正常,但是我不能要求用户这样做。
我在这里应该做什么?
[EDIT]很明显,我有自己的MSI。但是,我有。我没有用魔术棒控制用户的机器
答案 0 :(得分:5)
不,您已尽其所能。 VS如何弄清楚将部分程序集名称放入项目文件中实际上并不那么明显。这不是公共代码,不能被篡改。非常确定它不会使用白名单,并且不会注意参考程序集的位置。
最可能的细节是程序集的PublicKeyToken。框架组合件始终必须具有相同的值b77a5c561934e089。 CLI规范(Ecma-335)中甚至规定了它的值。其次,很可能相距很远的地方是签名证书,该签名将程序集标识为Microsoft拥有。但是,两者都存在完全相同的问题,您无法获得强名称或签名程序集所需的私钥。它们被锁定在Redmond的一个库中,只有受信任的构建工程师才能访问它们。
您还忽略了另一个令人讨厌的小细节,您几乎不怕DLL Hell。冷酷的事实是,如果您在任何不受您控制的计算机上 ever 在GAC中公开程序集,那么您将永远无法再次更改它。您不能再修改程序集的公共接口。无法添加新的公共方法或类型,无法修改方法的参数和返回类型,无法添加枚举成员,等等。更糟糕的是,Microsoft担心的是,您无法真正更改私人和内部成员。程序员有一个技巧,可以使用Reflection来解决这个很棒的错误修复工具。但是至少您可以告诉他们“不要那样做!”。
进行此类修改需要来增加[AssemblyVersion]。现在,您将获得另一种类型的DLL Hell,该计算机可能尚未由安装程序更新。或更糟糕的是,解决方案使用具有不同引用的项目。 Microsoft必须通过修改CLR来解决框架程序集的此问题。自动将旧版本转发到新版本。可以在.NET 4.x项目中使用使用为.NET 2.0构建的程序集的基本原因。您自己的DLL无法获得这种服务。
“不要这样做”是唯一的好建议,但是遇到DLL Hell麻烦是我可以向任何人推荐的绝佳学习经验。必须经历地狱才能被恐惧。
最好的建议是发布Nuget程序包。它们正好相反,从未部署在GAC中,版本号变化非常快。但是在程序员需要时总是可用。
答案 1 :(得分:1)
有几种方法...
1)将创建一个新的设置,并将其打包为您所针对的框架。您可以打包并使用域控制器进行部署。当您的用户登录域时,将更新软件包,这样,您就可以将软件部署到特定用户或user groups。根据您的infrastructure,您将拥有可以使用的软件管理基础结构(包括2个链接)。
2)如果您以开发人员为目标,则创建一个NuGet软件包。如果您的组织托管您自己的NuGet服务器,则会限制分发。将Package源添加到Visual Studio,打开“选项页”,在搜索字段中键入NuGet,然后设置URL / UNC路径。
3)使用OneClick部署,这使您可以让应用程序下载更新的dll并将其安装在计算机上。它需要一个代码签名证书,但是您可能还是要对代码签名(如果这样做,最好使用防病毒工具)。
现在,链接MyAsam.dll将由应用程序链接定义或IoC容器完成。基本上,如果找到dll且未定义任何版本,它将采用发现的第一个,我认为顺序是1 AppFolder,2 GAC,3 Path(不确定)。这种“按您所能找到的东西”通常称为“ DLL地狱”,NuGet和OneClick解决方案在此方面效果最佳,因为您将始终获得适用于该应用程序的更新的dll。如果使用dll的Moe少于1个应用程序,并且两者都需要“正确”版本,而其中的“正确版本”不同,那么将DLL放入GAC将会出现问题。...
答案 2 :(得分:-1)
如果您具有MYASM.dll的源代码,那么我希望将项目引用添加到使用中的应用程序。这样做时,Visual Studio将为所有引用的项目创建一个GUID。