gpt4 book ai didi

c# - 在 C# 和 C 之间传递对象

转载 作者:行者123 更新时间:2023-11-30 19:50:26 24 4
gpt4 key购买 nike

我的应用程序由带有非托管 C dll 调用的 C# 代码组成。在我的 C# 代码中,我有一个对象/类,其中它的属性都是系统类型,例如 string 和 int 以及我定义的其他对象。

我想将这个复杂的 (Graph.cs) 对象传递给我的 C (dll) 代码,您在这里建议采用哪种实现方式?

我尝试过移动结构体,但除了字符串和 int 之外,我没有这样做过。

谢谢。

代码:

public Class Grpah {

TupleCollection m_TupleCollection;
int m_nGeneralIndex;
bool m_bPrintWRF;
string m_sLink;
}

public Class TupleCollection {

IList<Tuple> _collection;

}

public Class Tuple {

Globals.TupleType m_ToppleType;
ArrayList m_Parameters;

}

public class TupleArgs {

public string Value { get; set; }
public Globals.PAS PAS;
public RefCollection RefCollection { get; set; }
public int Time{ get; set; }

}

public class RefCollection {

public List<int> SynSet{ get; set; }
public Globals.PAS PAS;

}

最佳答案

尝试:

How to: Marshal Structures Using PInvoke

我认为您取得进步的最简单方法是修改 native 代码,使其能够使用 CLR 类型。

现在,您几乎可以肯定使用的是 Visual Studio,希望它是 VS2005 或更高版本。这意味着虽然您现有的 native 代码是用 C 编写的,但您可以选择深入研究一点 C++。不仅如此 - 您还拥有 C++/CLI。

所以我会创建一个新的 C++/CLI DLL,并将您的 C 库链接到它,以便它可以调用 C 代码。然后在 C++/CLI 库中编写一个薄翻译层:它将公开真正的 CLR 类(使用 ref class 编写)并将调用 native C 代码。

例如在 C 头文件中:

void do_something_with_foo_data(int a, int b, int c);

在 C++/CLI 中:

public ref class FooWrapper
{
static void DoSomethingWithFoo(Foo ^foo)
{
// pick apart the Foo class and pass the pieces on to the C function

do_something_with_foo_data(foo->A, foo->B, foo->C);
}
};

在 C# 中:

public class Foo
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}

...

var foo = new Foo { A = 1, B = 2, C = 3 };
FooWrapper.DoSomethingWithFoo(foo);

关于c# - 在 C# 和 C 之间传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2305215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com