使用 COM 的参数化构造函数实例化类

Posted

技术标签:

【中文标题】使用 COM 的参数化构造函数实例化类【英文标题】:Instantiating class with parameterized constructor from COM 【发布时间】:2013-10-10 07:18:13 【问题描述】:

是否可以用 COM 调用参数化构造函数? 我将创建一个具有 COM 参数化构造函数的 C# 类实例。 现在它引发了内存异常。所以我不确定带有 COM 的参数化构造函数的 C# 类的实例化。所以请告诉我同样的情况。

我的 C# 构造函数是

public GetNumberFromClass(NumberClass number)


C++ 构造函数:

NumberFromC#::NumberFromC#

    getNumberFromClassPtr.CreateInstance(__uuidof(GetNumberFromClass));

并且指针 getNumberFromClassPtr 在出现 NULL 时会引发内存异常。

【问题讨论】:

请提供说明内存异常的SSCCE。 @nijansen 我不确定 COM-Visible C# 程序集可以是“短”还是“自包含”... @SkoolBoyAtWork,您可能需要关注this related question。 【参考方案1】:

这是不可能的,COM 没有将参数传递给构造函数的机制。这在您的 C++ sn-p 中最为明显,您根据需要使用 __uuidof 关键字指定了类的 GUID,但您没有传递 NumberClass 参数。你不能。

接下来的问题是您没有检查错误,CreateInstance() 返回一个 HRESULT。这会告诉你该方法失败了。嵌入式接口指针仍然为 NULL,当您继续行驶时,这将使您的程序因访问冲突而崩溃。

首先在你的 C# 类中去掉那个构造函数来解决这个问题,它必须有一个默认的构造函数才能被 COM 使用。添加 NumberClass 类型的属性,以便您可以在创建对象后设置该值。当然,还要改进 C++ 代码中的错误处理,如果您没有任何故障,这些故障将变得完全无法诊断。您必须检查 CreateInstance() 的返回值,并且必须在使用该对象的代码中添加 try/catch 块,以便捕获方法调用失败时将引发的 _com_error 异常。

【讨论】:

嗯,这不是唯一的解决方案。他可以使用具有可以接受任何参数的创建者方法的类工厂。 感谢您的回复。能否请您告诉我与类工厂创建者方法相关的示例或链接。所以我会尽早在我的代码中实现它 您可以使您的 C++ 代码看起来像您喜欢的任何方式,编写一个调用 CreateInstance() 的小辅助函数,然后将属性设置为样板。否则与您的问题没有任何关系。 感谢您的回复。

以上是关于使用 COM 的参数化构造函数实例化类的主要内容,如果未能解决你的问题,请参考以下文章

Android IntentService 无法实例化类;没有空的构造函数

为啥使用set注入,一定要给类提供一个无参的构造函数,否则Spring不能实例化类的.

使用 Clojure reify 提供构造函数

MSBuild:描述要调用的构造函数

设置方法或构造函数

构造函数