簡體   English   中英

使用PowerShell創建COM對象的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM