gpt4 book ai didi

c# - 修改从 C# 传递给 DLL 的结构值

转载 作者:行者123 更新时间:2023-11-30 16:23:42 25 4
gpt4 key购买 nike

我正在尝试做两件事:从 C dll 函数获取返回值,并让同一个函数修改传递给它的结构的 1 个成员。经过多次实验,我能够让函数返回一个值,但我仍然无法让它将修改后的值返回给 C# 代码;该值保持(未修改)为 0。我尝试了很多变体(ref、[In,Out] 等)都无济于事

using System;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;

namespace Vexing.Problem{
public class myIdx : VexingObject {
public myIdx(object _ctx) : base(_ctx) { }
private IPlotObject plot1;
[StructLayout(LayoutKind.Sequential)]
public class PLEX { public int yowser; }

[DllImport("my.dll", CharSet = CharSet.Unicode)]
public static extern int cFunction(
[MarshalAs(UnmanagedType.LPStruct)] PLEX mPlex);

PLEX a;
protected override void Create() { a = new PLEX(); }
protected override void CalcBar() {
int mf = cFunction(a);
plot1.Set(a.yowser); }
}}

// pertinent c dll code
typedef struct s_plex { int yowser;} cplex;

extern "C" __declspec( dllexport )
int cFunction(cplex *Cplex){ Cplex->yowser = 44; return 1;}

最佳答案

您的进口申报有误。
在您的案例中设置 CharSet 没有任何意义( native 函数声明中没有字符串参数)。
如果你想传递类实例,ref/out 也必须被丢弃(类通过引用传递)。
要点:extern "C"__declspec( dllexport ) 表示 CallingConvention.Cdecl

更新。这是完整的工作代码示例:
C++( header ):

struct CStruct
{
int myField;
};

extern "C" __declspec( dllexport ) int MyFunction(CStruct *pStruct);

C++(代码):

int MyFunction(CStruct *pStruct)
{
pStruct->myField = 100;
return 1;
}

C#:

[StructLayout(LayoutKind.Sequential)]
class MyStruct
{
public int myField;
};

class Program
{
MyStruct myStruct = new MyStruct();

[DllImport("MyLib.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int MyFunction(MyStruct pStruct);

static void Main(string[] args)
{
var p = new Program();
var result = MyFunction(p.myStruct);

Console.WriteLine("Result: {0}, MyStruct.myField = {1}", result, p.myStruct.myField);
}
}

打印:

Result: 1, MyStruct.myField = 100

关于c# - 修改从 C# 传递给 DLL 的结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11318002/

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