我正在尝试使用PowerShell安装COM +组件。但我得到了以下错误。
Unable to find type [some.dll]. Make sure that the assembly that contains this
type is loaded.
+ $comAdmin.InstallComponent("test", [some.dll]);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (COMITSServer.dll:TypeName) [], Runtime
Exception
+ FullyQualifiedErrorId : TypeNotFound
这是我的powershell脚本:
$comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog;
$comAdmin.InstallComponent("some", [some.dll]);
#if an exception occurs in installing COM+ then display the message below
if (!$?)
{
Write-Host "Unable to Install the COM+ Component. Aborting..."
exit -1
}
我的powershell版本是4.0 有人可以帮我这个。
谢谢。
答案 0 :(得分:0)
PowerShell中的方括号表示类型,例如[string]
或[int32]
或[System.Array]
或[System.Math]
。错误消息是抱怨,因为您告诉PowerShell COMITSServer.dll是已注册和加载的数据类型。
此外,InstallComponent
COMAdminCatalog
方法在我看来有四个参数,而不是两个。您应该能够通过查看定义来确认,但我不知道v2.0是否支持这样做:
PS U:\> $comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog
PS U:\> $comAdmin | gm | where { $_.Name -eq 'InstallComponent' }
TypeName: System.__ComObject#{790c6e0b-9194-4cc9-9426-a48a63185696}
Name MemberType Definition
---- ---------- ----------
InstallComponent Method void InstallComponent (string, string, string, string)
因此,我会尝试这个:
$comAdmin.InstallComponent("ITSServerOO2", "COMITSServer.dll", "", "");
这似乎是VB代码here调用相同方法的方式:
' Open a session with the catalog.
' Instantiate a COMAdminCatalog object.
Dim objCatalog As COMAdminCatalog
Set objCatalog = CreateObject("COMAdmin.COMAdminCatalog")
[...]
' Install components into the application.
' Use the InstallComponent method on COMAdminCatalog.
' In this case, the last two parameters are passed as empty strings.
objCatalog.InstallComponent "MyHomeZoo","MyZoo.DLL","",""
Here是该函数的类定义,我相信,虽然我对COM +不太熟悉,但不知道COMAdminCatalog和ICOMAdminCatalog是否相同。
答案 1 :(得分:0)
这是关于0x80110401 HRESULT的问题的答案。 (顺便说一下,后续问题应该在关于SO的新帖子中回答,而不是在现有问题的评论中)。这允许其他人在遇到相同问题时找到答案。
ICOMAdminCatalog::InstallComponent的文档。正如文档解释的那样,第一个参数是GUID,第二个参数是要注册的DLL。第三个参数(typelib)和第四个(代理存根DLL)是可选的,可以指定为空字符串。
"测试"不是有效的GUID。请注意,GUID是一种不同的.NET类型(System.Guid
)。但是文档要求BSTR转换为System.String
。要将新GUID作为字符串使用,请使用:[Guid]::NewGuid().toString()
。
请注意,COM +组件的GUID是众所周知的"实现接口的COM服务器和使用COM服务器接口的客户端使用的值。因此,通常您不希望在注册COM服务器时生成新的GUID,但使用开发人员在开发COM服务器时创建的GUID。但是,如果您不知道要使用的GUID是什么,那么生成新的GUID至少可以让您在开发脚本方面取得进展。
这可能会或可能不会解决导致0x80110401的问题,但它肯定会解决您迟早会遇到的问题。