[英]CreateObject C#
我已經有一個本機代碼COM對象,正在嘗試從C#實例化它。 Com在DCOM組件和注冊表中注冊。
這是我要嘗試做的:
public static void Main(string[] args)
{
Type t = Type.GetTypeFromProgID("CaseConsole.Application");
dynamic app = Activator.CreateInstance(t);
dynamic c = app.Case;
c.OpenCase("17-16", 0);
}
如果我嘗試實例化com-type,則會得到:
NotImplementedException
執行被拋出以下行:
dynamic c = app.Case;
在此行設置斷點時,我查看了“ app”,並且該錯誤已經存在
我查看了Type t,它顯示:IsCOMObject = true
作為VBS,它運作良好:
Dim App
Dim c
Set App = CreateObject ("CaseConsole.Application")
Set c = App.Case
c.OpenCase "17-16", 0
作為VB.net,它可以正常工作
Sub Main()
Dim App
Dim c
App = CreateObject("CaseConsole.Application")
c = App.Case
c.OpenCase("17-16", 0)
End Sub
但不是在C#中
對於C#示例,我查看了
http://www.codeproject.com/Articles/990/Understanding-Classic-COM-Interoperability-With-NE
https://msdn.microsoft.com/zh-CN/library/aa645736%28v=vs.71%29.aspx
我的猜測是我必須使用InvokeMember或安全性東西來調用方法...
請您幫忙使c#示例正常工作嗎?
將重命名大小寫更新為c,但這不是問題。
您的C#程序與VBS和VB.NET程序略有不同。 運行此代碼的線程的單元狀態不同。 異常來自代理,應解釋為“不支持從工作線程運行此代碼”。 做得很好。 固定:
[STAThread]
public static void Main(string[] args)
{
// etc..
}
請注意添加的[STAThread]屬性。 從技術上講,這樣做是不正確的,控制台模式的應用程序不能為單線程COM對象提供正確的運行時環境,但是如果VB.NET應用程序可以工作,那么您不必擔心。 如果您發現死鎖,那么您會知道要尋找什么。 當您通過InvokeMember使用后期綁定時,它可以工作,因為它使用IDispatch並且具有不同的代理。
非常感謝Sami Kuhmonen,解決方案是:
object c = t.InvokeMember("Case", BindingFlags.GetProperty, null, app, null);
t.InvokeMember("OpenCase", BindingFlags.InvokeMethod, null, c, new object[] { "17-16", 0 });
所以我沒有意識到“ Case”是一個財產。
解決了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.