如何在没有gacutil的情况下注册64位DLL

时间:2011-03-29 13:28:24

标签: windows dll powershell

我有一个ASP Classic应用程序,它引用了一些VB6 COM OBJECTS。其中一个VB6 COM OBJECTS引用了另一个第三方.Net DLL。

需要在Windows Server 2008 R2 x64计算机上注册第三方.Net DLL。

我找到了在GAC中注册DLL的脚本,而没有GACUTIL使用powershell(参考:http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell.aspx

现在我需要注册程序集。我在我的本地开发机器(x86)上使用了GACUTIL和REGASM,没有任何障碍。但是当我尝试在测试服务器上获取DLL时,我遇到了问题。

第一期:没有GACUTIL

服务器上没有GACUTIL,我使用上面提到的脚本。我知道它可以使用SDK安装,但我不想“污染”环境。

第二个问题:REGASM无法找到装配

32位.Net Framework下的REGASM找不到DLL。报告错误:“RegAsm:错误RA0000:无法找到输入程序集'C:\ Windows \ System32 \ xxxxx.dll'或其依赖项之一。”

所以我使用了RegAsm的64位变体并且有效。

我担心的是,这是一个误报,因为ASP经典没有找到程序集,因为它没有被32位RegAsm注册。

我运行我的应用程序我的事件日志中出现错误:“ActiveX组件无法创建对象”。一般来说,这是因为找不到要创建的对象,这意味着托管该对象的DLL未正确注册。

所以我现在要做的是找出REGASM是否有另一种使用powershell的方法,它将在32位范围内注册程序集。

有谁知道这是否可行以及脚本是什么才能使它正确?

2 个答案:

答案 0 :(得分:1)

我发现我将.Net DLL放在测试计算机上的错误文件夹中进行注册。

在Windows 64Bit OS上,您拥有System32和SysWOW64文件夹。我把我的DLL放在System32文件夹中,它应该放在SysWOW64文件夹中。

我从RegAsm得到的错误(“RegAsm:错误RA0000:无法找到输入程序集'C:\ Windows \ System32 \ xxxxx.dll'或其中一个依赖项。”)应该让我点击但我错过了它

基本上32位RegAsm找不到我的DLL,但是64位RegAsm可以找到我的文件,并通过使用64位RegAsm注册程序集,我将DLL放入64位范围。我需要它在32位范围内。

我将DLL表单System32移动到SysWOW64,32位RegAsm找到了DLL并在32位范围内注册了它。

现在我的VB6 COM对象可以找到.Net DLL,它可以解决错误“ActiveX组件无法创建对象”。

尽管如此,我还没有找到一个与RegAsm完成相同工作的库或函数,而没有实际使用RegAsm。

如果有人发现这个神话般的野兽,请回答这个问题。提前谢谢。

答案 1 :(得分:0)

不确定,但您的麻烦似乎来自于UAC Virtualisationthis article can also help)的副作用,它存在于Vista中并且仍然有效。一个抽象是文件系统和注册表的系统部分现在受到保护,不受用户访问,但假设旧的(32位)程序继续工作,系统让他们相信他们在这些部分上写,但实际上他将它们重定向到用户的地方。 在您的注册表中查看“HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node”。

我最近遇到的一个问题是我的MSI是使用32位库构建的,因此在64位计算机上安装期间调用这些库会使UAC虚拟化在Wow6432Node中安装我的注册表项。 This Internet article帮助我解决问题。我使用Orca将Installutillib.dll从32位替换为64位。

我希望它有所帮助

JP