CreateObject C#

CreateObject C#,c#,com,createobject,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(

我已经有一个本机代码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);
}
Dim App
Dim c

Set App = CreateObject ("CaseConsole.Application")
Set c = App.Case

c.OpenCase "17-16", 0
如果我尝试实例化com类型,则会得到:

NotImplementedException
执行选项在第行抛出:

dynamic c = app.Case;
当我在这行设置断点时,我查看了“app”,错误已经出现了

我查看了类型t,它显示:IsCOMObject=true

作为VBS,它工作得很好:

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);
}
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#示例,我查看了来自

我的猜测是,我必须用InvokeMember或一个安全的东西调用这些方法

请你帮个忙,让c#示例工作起来好吗


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

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

object c = t.InvokeMember("Case", BindingFlags.GetProperty, null, app, null);
t.InvokeMember("OpenCase", BindingFlags.InvokeMethod, null, c, new object[] { "17-16", 0 });
所以我没有意识到这个事实,那个“案例”是一个财产

已解决

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

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

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

这不是
动态的问题。