将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序

Posted

技术标签:

【中文标题】将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序【英文标题】:Passing a C# object (containing a static object member) as a paramter to C++/CLI program 【发布时间】:2018-09-07 08:41:57 【问题描述】:

在我的 C# 代码中,我有一个类

[Serializable] 
public class MySignal: IMySignal

    static List<IDescription> m_Descriptions;
    public string m_Comment;
    public IList<string> m_Names;
 

我的 C# 主程序中有一个函数调用 C++/CLI 外部程序(使用 .NET Remoting)。我在这个函数中传递了一个字符串、一个双精度和我的 MySignal 类型的对象“测试”。

bool GenSignal(string sSignalName, double pValue, MySignal test);

在 C++/CLI 代码中,我在托管类中实现了 GenSignal 函数。

bool ManagedScriptInterface::GenSignal(String^ sSignalName, double pValue, MySignal^ test)

//Debugging is stopped here
//Some code... 


在我的函数内部调试时,我可以获得我的对象(MySignal^ 测试)。在其中我可以访问所有公共成员(m_Names 和 m_Comment)。但是,静态对象成员 m_Descriptions(声明为静态的,我在 C# 程序中绝对需要它)等于 nullptr。

我的问题是:如何让我的静态对象 m_Descriptions 可见并在 C++/CLI 的函数中访问它。

我希望有人能就这个话题提供帮助。

非常感谢!

【问题讨论】:

首先你确定在 C# 主函数中 m_Descriptions 不为空。其次,您是否尝试过在修改后的函数 bool ManagedScriptInterface::GenSignal(String^ sSignalName, double pValue, MySignal^ test, List^ description) 中显式传递静态 m_Descriptions 当然 m_Descriptions 在我的 C# 程序中不为空。我试图显式传递静态 m_Descriptions 并且我成功地在 ManagedScriptInterface::GenSignal 函数中没有任何问题地得到它。但是,在我的对象 MySignal^ 测试中,所有静态成员都等于 nullptr(当然 m_Descriptions 也是 null)。看起来我的对象(MySignal^ 测试)的静态成员已重新初始化。我怀疑调用了一个静态构造函数并且正在“擦除”我的静态成员。供您参考,我的 C# 代码中没有实现任何静态构造函数。 我从我的 C# 类中删除了 [Serializable] 并使用了 MarshalByRefObject。似乎解决了我的问题。我在 C# 中没有任何扎实的背景,但我认为 Serializable 属性不适合我的情况,因为我正在使用 .NetRemoting 将域从 C# 中的一个程序更改为 C++/CLI 中的另一个程序。这篇文章也帮助了我的调查:***.com/questions/9806372/… 【参考方案1】:

我从我的 C# 类中删除了 [Serializable] 并使用了 MarshalByRefObject。似乎解决了我的问题。我在 C# 中没有任何扎实的背景,但我认为 Serializable 属性不适合我的情况,因为我正在使用 .NetRemoting 将域从 C# 中的一个程序更改为 C++/CLI 中的另一个程序。 Serializable 属性似乎在当前 AppDomain 中创建了我的对象的本地副本。

这篇文章对我的调查也有帮助:Static Variable Instances and AppDomains, what is happening?

【讨论】:

以上是关于将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将 unique_ptr 对象作为参数传递给作为库的类

如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript

C ++,将对象作为参数传递给另一个对象构造函数

JavaScript:如何将多个参数传递给对象成员内的回调函数?

将String作为参数传递给Javascript中对象的InnerHtml属性

this指针