2011-09-07 37 views
5

Trong Python, khi tôi muốn sử dụng đối tượng COM này, tất cả những gì tôi làm là win32com.client.Dispatch("Myapp.Thing.1") và nó mang lại cho tôi một đối tượng mà tôi có thể gọi phương thức và .Khởi tạo đối tượng COM cũ trong C# động (sử dụng ID của nó trong chuỗi)

Tôi muốn làm điều này trong C# và, thật đáng kinh ngạc, tôi dường như không thể tìm ra cách. Tôi làm không phải muốn sử dụng một trong những trình bao bọc COM được tạo tự động, vì lý do tôi không thể tham gia. Tôi cần phải làm muộn, COM động của thời gian qua.

Tôi đã thử làm điều này, nhưng tôi nhận được Null Ref Exception trên cuộc gọi gọi.

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.GetMethod("xyz").Invoke(o, args) 

Bất kỳ mã ví dụ nào có thể tải lên đối tượng COM theo tên và sử dụng theo cách cơ bản sẽ là lý tưởng.

+0

Jason trước hết bạn có thể thêm một số kiểm tra vào mã của mình và xác định xem t hoặc o là null không? nếu vậy và nếu bạn nói với chúng tôi, thì chúng ta có thể bắt đầu xem xét nó. –

+0

Tôi chỉ chạy lại với những kiểm tra tại chỗ, không t cũng không trở lại null. Cám ơn rất nhiều về sự giúp đỡ của bạn! – William

+0

và bạn có chắc chắn rằng phương thức xyz tồn tại trên đối tượng đó không? –

Trả lời

8

Khi loại của bạn được truy xuất thông qua GetTypeFromProgID, Bạn không thực sự có loại - bạn có loại __ComObject kết thúc tốt đẹp đối tượng COM được tạo - vì vậy nó không có phương thức "xyz" trên đó. Do đó ngoại lệ tham chiếu null của bạn - GetMethod("xyx") đang trả về giá trị rỗng.

Để gọi phương pháp, sử dụng t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) thay vì:

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) 
+0

Hình như nó đang làm việc! Và làm thế nào để tôi có được/thiết lập tài sản ?? Cám ơn rất nhiều! – William

+0

Bạn vẫn sử dụng InvokeMember, tham số 'BindingFlags' kiểm soát những gì bạn làm - sử dụng' BindingFlags.GetField' hoặc 'BindingFlags.GetProperty', v.v. Xem http://msdn.microsoft.com/en-us/library/66btctbe.aspx và http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx –

8

Bạn nên sử dụng các loại năng động đó là chính xác những gì nó cho. Bạn sẽ không thể nhập thể hiện mà không có trình bao bọc. Thay vào đó bạn có thể làm điều này.

dynamic app = Activator.CreateInstance(
             Type.GetTypeFromProgID("MyApp.Thing.1")); 
app.XYZ(): 
Các vấn đề liên quan