[英]Use PowerShell to create instance of COM object
我試圖在PowerShell會話中使用SAP / BusinessObjects的Universe設計工具(UDT)。
我注冊了類型庫:
C:\> C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe "C:\Program Files (x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win32_x86\designer.tlb
我試圖直接在PowerShell中創建Designer的實例:
PS> $app = New-Object -ComObject Designer.Application
System.__ComObject
該實例沒有任何預期的屬性和方法:
PS> $app | get-member
TypeName: System.__ComObject
Name MemberType Definition
---- ---------- ----------
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
ToString Method string ToString()
接下來,我創建了一個C# Cmdlet
,其中包含了Designer的某些功能:
[System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Open, "Universe")]
[OutputType(typeof(Designer.Universe))]
public class OpenUniverse : System.Management.Automation.Cmdlet
{
Designer.Application application = null;
[System.Management.Automation.Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
[Alias("FullName")]
public string[] Paths
{
get { return paths; }
set { paths = value; }
}
private string[] paths;
protected override void BeginProcessing()
{
application = new Application();
application.Interactive = false;
try
{
application.Logon("user", "password", "cluster", "secWinAd"); }
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
} # /BeginProcessing
protected override void ProcessRecord()
{
Designer.Universe universe = null;
try
{
foreach (string path in Paths)
{
universe = application.Universes.Open(path);
WriteObject(universe);
}
}
catch (System.Runtime.InteropServices.COMException e)
{
# ...
}
finally
{
if ( universe != null ) { universe.Close(); }
}
} # /ProcessRecord
} # / OpenUniverse
在Visual Studio 2010測試中運行時,代碼將返回預期的對象。
我創建了一個清單,該清單引用了由該項目創建的程序集,然后將該模塊導入到一個新的PowerShell會話中。
PS> $unv = Open-Universe 'C:\Users\XXX\AppData\Roaming\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\Universes\Foo.unv'
PS> $unv
System.__ComObject
有沒有一種方法可以讓PowerShell反映生成System.__ComObject
實例的屬性和方法?
我不確定,但是為了使PowerShell
可以顯示實例的屬性和方法(后期綁定),COM實例必須實現ITypeInfo
接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.