簡體   English   中英

CreateObject C#

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

C#中CreateObject的等效代碼

我的猜測是我必須使用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.

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