繁体   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