将 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^我从我的 C# 类中删除了 [Serializable] 并使用了 MarshalByRefObject。似乎解决了我的问题。我在 C# 中没有任何扎实的背景,但我认为 Serializable 属性不适合我的情况,因为我正在使用 .NetRemoting 将域从 C# 中的一个程序更改为 C++/CLI 中的另一个程序。 Serializable 属性似乎在当前 AppDomain 中创建了我的对象的本地副本。
这篇文章对我的调查也有帮助:Static Variable Instances and AppDomains, what is happening?
【讨论】:
以上是关于将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript
JavaScript:如何将多个参数传递给对象成员内的回调函数?