CreateObject C#

时间:2015-04-25 06:03:29

标签: c# com createobject

我已经有一个本机代码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"并且错误已经存在

我查看了类型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/en-us/library/aa645736%28v=vs.71%29.aspx

Equivalent code of CreateObject in C#

我的猜测是我必须使用InvokeMember或安全事件来调用方法......

请帮助让c#示例正常工作?

更新将案例重命名为c,但这不是错误。

2 个答案:

答案 0 :(得分:0)

您的C#程序与VBS和VB.NET程序略有不同。运行此代码的线程的单元状态是不同的。异常来自代理,它应该被解释为“不支持从工作线程运行此代码”。做得很好。修正:

[STAThread]
public static void Main(string[] args)
{
   // etc..
}

注意添加的[STAThread]属性。这样做在技术上是不正确的,控制台模式应用程序不为单线程COM对象提供正确类型的运行时环境,但如果VB.NET应用程序工作,那么你几乎不用担心。如果您注意到死锁,那么您将知道要寻找什么。它通过InvokeMember使用后期绑定时起作用,因为它使用IDispatch并且它有不同的代理。

答案 1 :(得分:-1)

非常感谢Sami Kuhmonen,解决方案是:

object c = t.InvokeMember("Case", BindingFlags.GetProperty, null, app, null);
t.InvokeMember("OpenCase", BindingFlags.InvokeMethod, null, c, new object[] { "17-16", 0 });

所以我没有意识到这个事实,“案例”是一个财产。

<强>解决