簡體   English   中英

如何在C#中通過帶有反射的ProgID調用COM對象

[英]How to call a COM Object by ProgID with Reflection in C#

class Device{
    private object device;
    public Device(string ProgID)
    {
        if (ProgID == "") ProgID = "ScopeSim.Telescope";
        device = Activator.CreateInstance(Type.GetTypeFromProgID(ProgID));
        Console.WriteLine("Connected");
    }
    public object Invoke(string Name, object[] args)
    {
        var v1 = device.GetType(); //this is a com object in debug
        var v2 = v1.GetMethod(Name);
        var v3 = v2.Invoke(device,args); //throws exception, v2 is null
        return v3;
    }
}
//somwhere else in another method in another class that has this in a field...
Console.WriteLine(new Device("").Invoke("A Method Name that is a string but is not known and could be anything, for testing, the name is 'Unpark'", object[] args));

這將引發NullReferenceException Unpark方法確實存在,但沒有返回類型,但確實存在。 同樣,當它停止調試(例外)時,構造函數中的ProgID字段為null。 我認為這是正常的,對吧? 它已經運行了。 有誰知道它為什么扔它? 如果我將device聲明為dynamic ,則說它不能在運行時綁定到空對象(基本上是同一件事)。

對第一答案的回答:我認為反射需要將變量作為對象數組。 是的,Unpark是用大寫的U書寫的。ProgID事情似乎無關緊要。

好吧,如果ProgID為null ,則不會設置它,因為您僅檢查字符串是否為空。 我總是使用string.IsNullOrEmpty(s)代替s == ""

檢查一下:

  • Unpark方法真的用大寫U書寫嗎?
  • 是否需要object []參數?

好吧,由於這個答案,我想我終於明白了: https : //stackoverflow.com/a/3199919/258482 問題是您必須使用InvokeMember對COM對象執行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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