【发布时间】: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 中的另一个程序。这篇文章也帮助了我的调查:stackoverflow.com/questions/9806372/…