[英]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 == ""
。
檢查一下:
好吧,由於這個答案,我想我終於明白了: https : //stackoverflow.com/a/3199919/258482 。 問題是您必須使用InvokeMember
對COM對象執行任何操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.