gpt4 book ai didi

c# - C# 中用于从 DllImport 函数中检索引用的指针

转载 作者:搜寻专家 更新时间:2023-10-31 00:05:25 25 4
gpt4 key购买 nike

我在我的 C# 项目中引用了一个 DLL,如下所示:

[DllImport("FeeCalculation.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]

public static extern void FeeCalculation(string cin, string cout, string flimit,
string frate, string fwindow, string fincrement, string fbird,
string fparameter, string fvalidation, string fcoupon);

FeeCalculation函数在DLL中导出如下:

extern "C" __declspec(dllexport) void __stdcall FeeCalculation(char *cin, 
char *cout, char *flimit, char *frate,
char *fwindow, char *fincrement, char *fbird,
char *fparameter, char *fvalidation, char *fcoupon);

DLL 函数以 char * 的形式返回对其内部结构的引用,因此如果您要在 C++ 中引用此 DLL,您将执行以下操作来进行计算并获取返回的结构:

FeeCalculation(buff, (char *)&fans, (char *)fl, (char *)ft, (char *)fw, (char *)fi, (char *)fe, (char *)&fm, (char *)val, (char *)cpn);

现在,如何使用 C# 检索通过引用返回的那些值?意思是,我如何在 C# 中做同样的事情来获取返回的结构以获得返回的计算?我知道我需要创建一个不安全的方法,但我不清楚如何像在 C++ 中那样处理 C# 中的内存地址。

编辑:下面说明要使用 IntPtr,但是如何放入相同的结构中以便可以引用结构的字段?

编辑:这是我感兴趣的返回结构(cout):

struct feeAnswer {


unsigned int fee;

unsigned int tax1;

unsigned int tax2;

unsigned int tax3;

unsigned int tax4;

unsigned int surcharge1;

unsigned int surcharge2;

unsigned int validationFee;

unsigned int couponFee1;

unsigned int couponFee2;

unsigned int couponFee3;

unsigned int couponFee4;

unsigned short int dstay; //Day Stay

unsigned short int mstay; //Minute Stay

};

这是我将与其他结构一起传递的 (cin)(目前它们是零字节,我想先让它工作,然后再实现其余部分):

struct feeRequest {

unsigned char day;

unsigned char month;

unsigned int year; //2000 ~ 2099



unsigned char hour;

unsigned char minute;

unsigned char rate;

unsigned char validation;



unsigned char coupon1;

unsigned char coupon2;

unsigned char coupon3;

unsigned char coupon4;

};

最佳答案

本例中的 char* 参数不是字符串,而是指向表示数据的原始字节 block 的指针。您应该将参数编码为 IntPtr 类型的实例,并结合 Marshal.AllocHGlobal创建一 block 内存,然后 Marshal.PtrToStructure将该内存块转换为可用的 .NET 类型。

举个例子:

[StructLayout(LayoutKind.Sequential)]
struct MyUnmanagedType
{
public int Foo;
public char C;
}

IntPtr memory = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MyUnmanagedType)));

try
{
FeeCalculation(memory);

MyUnmanagedType result = (MyUnmanagedType)Marshal.PtrToStructure(
memory, typeof(MyUnmanagedType));
}
finally
{
Marshal.FreeHGlobal(memory);
}

关于c# - C# 中用于从 DllImport 函数中检索引用的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2344929/

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