【发布时间】:2015-06-23 12:06:22
【问题描述】:
我在使用 C# 从 C DLL 调用函数时遇到问题。我试图编组结构,但一个异常告诉我我的结构太大或太复杂而无法编组......我计算了 15256 字节的完整大小。
原来的C函数是这样的:
int32_t CN_API SetConfig(int32_t handle, int32_t bId, ModeEnum Mode, ParamStruct params);
我在 C# 中定义的结构如下所示:
struct ParamStruct
{
int param1;
...
//Here are some primitve arrays and variables...
...
structArray1[16]
// |__...some integers
// |__structA
// |__...some variables
int param8
structB
// |__...some integer arrays and a float array
// |__structArray2[16]
// |__...some variables
enum param9
...
//here are some more structs and struct arrays
...
}
我知道“语法”不正确。只是你知道我的意思;)。
现在我想调用这个函数并将 ParamStruct 传递给它。
我的问题是,我该怎么做?你们中有人有解决我问题的好主意吗? 可以用 IntPtr 来做吗? 或者是用 C# 重写我的结构的最佳方法,使其不那么复杂?
如果您需要更详细的信息,请告诉我。
【问题讨论】:
-
最简单的方法是找到避免如此大的结构的方法
-
我只有 dll,不能改变里面的任何东西。我的意思是,我必须忍受这么大的结构。
-
我认为 C++/CLI 可能是最好的前进方式。从 C# pinvoke 手动编组该结构将是可怕的。
-
我发现围绕你希望使用的 dll 编写一个简单的 C++ 包装器,它只接受原始类型,这使得 pinvoke 的东西变得更加简单。此外,如果您创建结构的实例,则可以将 IntPtr 传递给您的包装器,然后在包装器中“编组”它。
-
@David Watts:感谢您的回答。我也想过这种可能性。但我希望有一种“简单”的方式或解决方法可以直接从 C# 中完成。 DLL 中还有更多运行良好的函数。这只是我遇到问题的一个功能。因此,我不想编写 C++ 包装器,因为如果我想这样做,我必须更改代码中的许多内容。
标签: c# c struct marshalling dllimport