![](/img/trans.png)
[英]P/Invoke causes crash on method with struct and callback parameters
[英]P/Invoke - simple addition of struct parameters
我有這個C代碼:
real_T addition(const struct_T parameters)
{
return parameters.a + parameters.b;
}
typedef struct
{
real_T a;
real_T b;
} struct_T;
typedef double real_T;
我像這樣從C#調用它:
using System.Runtime.InteropServices;
namespace AdditionConsoleApplication
{
class Program
{
[DllImport(@"X:\Bla\Addition.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double addition(struct_T parameters);
static void Main(string[] args)
{
struct_T parameters = new struct_T();
parameters.a = 1;
parameters.b = 3;
Console.WriteLine(addition(parameters));
}
}
}
這里的struct_T:
[StructLayout(LayoutKind.Sequential)]
class struct_T
{
public double a;
public double b;
}
不幸的是,數學是不正確的:
2.72645911468311E-284
誰能看到錯誤嗎?
您具有以下結構定義:
[StructLayout(LayoutKind.Sequential)]
class struct_T
{
public double a;
public double b;
}
p / invoke編組將通過引用來編組課程。 換句話說,將指向對象的指針傳遞給本機代碼。 此不匹配說明了程序失敗的原因。
解決方案是確保接口的兩側都匹配。 一種方法是通過雙方的價值傳遞。 一種簡單的實現方法是在C#中將結構聲明為值類型。 通過使其成為結構來實現:
[StructLayout(LayoutKind.Sequential)]
struct struct_T
{
public double a;
public double b;
}
另一種方法是在兩側都通過引用。 您可以通過在C#端使用class
並更改C代碼來實現。
real_T addition(const struct_T* parameters)
{
return parameters->a + parameters->b;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.