我必须处理一个将程序集直接安装到全局程序集缓存 (例如在%windows%/assembly深处) 的软件包。
我该如何将实际的程序集(DLL)从全局程序集缓存中移除,放到普通文件系统中?
谢谢。
我必须处理一个将程序集直接安装到全局程序集缓存 (例如在%windows%/assembly深处) 的软件包。
我该如何将实际的程序集(DLL)从全局程序集缓存中移除,放到普通文件系统中?
谢谢。
我使用了这篇文章中的建议从全局程序集缓存(GAC)中获取一个程序集。
将DLL从GAC中取出
一旦部署在GAC(通常位于c:\ windows \ assembly),DLL文件就无法像普通DLL文件那样查看或使用。它们不能直接从VS项目中引用。开发人员通常会在开发(设计)时保留原始DLL文件的副本,并在项目中引用该文件,而在项目运行时则使用来自GAC的程序集。
在执行(运行时)过程中,如果发现程序集已签名并部署在GAC中,则CLR会自动从GAC中选择程序集,而不是在VS设计时间中引用的DLL。如果开发人员删除了原始DLL,或由于某种原因没有它,则有一种方法可以从GAC获取DLL文件。按照以下步骤从GAC复制DLL:
运行regsvr32 /u C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\shfusion.dll
- shfusion.dll是资源管理器扩展DLL,为GAC文件夹提供了独特的外观。取消注册此文件将删除程序集缓存查看器,GAC文件夹将像资源管理器中的任何普通文件夹一样可见。
打开“%windir%\assembly\GAC_MSIL”。
浏览到您的DLL文件夹,以深入查找您的DLL。
在硬盘上的某个地方复制DLL文件,并在项目中从那里引用它
运行命令 "regsvr32 %windir%\Microsoft.NET\Framework\<.NET版本目录>\shfusion.dll" 重新注册 shfusion.dll 文件,恢复 GAC 的原始独立视图。
这里描述的方法非常简单:
文章摘要:
\\YourServer\C$\Windows\Assembly
)打开命令提示符并键入:
cd c:\windows\assembly\GAC_MSIL
xcopy . C:\GacDump /s /y
这应该会给出整个GAC的转储。
祝你使用愉快!是的。
添加DisableCacheViewer注册表项
在HKLM\Software\Microsoft\Fusion\下创建一个名为DisableCacheViewer的新DWORD键,并将其值设置为1。
返回Windows资源管理器中的程序集文件夹,就可以看到正常的文件系统视图了。
我认为最简单的方法是通过命令行来完成,就像David提到的那样。唯一的诀窍在于.dll文件并不仅仅位于C:\Windows\Assembly。你需要导航到C:\Windows\Assembly\GAC\[ASSEMBLY_NAME]\[VERSION_NUMBER]_[PUBLIC KEY]。然后可以使用以下命令进行复制:
copy [ASSEMBLY_NAME].dll c:\(或任何您想要的位置)
希望这能有所帮助。
打开RUN窗口,然后输入%windir%\assembly\GAC_MSIL
,这将以文件夹视图的方式打开您的dll文件,接着您可以浏览到您需要的dll文件所在的文件夹并打开它,您将会找到您的dll文件并轻松复制。
我发现的简单方法是打开命令提示符并浏览你提到的文件夹,直到找到所需的DLL文件 - 然后可以使用复制命令将其导出。Windows资源管理器对该文件夹有一个“有用”的特殊视图。
Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
我想我找到了一种方法,可以在不修改注册表、使用命令行、PowerShell或任何其他程序的情况下查看GAC内部:
创建一个新快捷方式(指向任何地方)。然后修改该快捷方式的目标为:
%windir%\assembly\GAC_MSIL\System
打开此快捷方式,可直接进入GAC中的系统文件夹(每个人都应该有),并具有让您切换到更高级目录,然后浏览任何其他文件夹(以及查看dll文件等)的奇妙副作用。
我已在Windows 7和Windows Server 2012上进行了测试。
注意:无法在创建快捷方式时使用此目标,但可以在编辑时使用。
享受吧!
shfusion.dll
不支持regsvr32
通过/i
选项调用的DllInstall()
入口点。省略该选项可以成功重新注册组件。 - Frédéric Hamidi