C# P/Invoke: 本机输出参数值不会到达托管代码
C# P/Invoke: native output parameter value won't reach managed code
我正在将本机 C++ DLL 编组为 C# DLL。我在 C/C++ 中不是很受认可,但在我遇到这个问题之前我已经设法让它工作了。这是一个非常简单的代码示例:
C++
PROASADLL __declspec(dllexport) void outTest(int* number){
int temp = *number + 10;
number = &temp; //*number = 12
}
C#
[DllImport("ProAsaNativeDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void outTest(ref int number);
public static int OutTest()
{
int number = 2;
outTest(ref number);
return number; //number = 2
}
请注意,我是我的真实场景,我试图让它与指向结构的指针一起工作,但我决定将其排除在外,因为这不是编组问题;即使是这个简单的代码也行不通。 C++ 代码可以工作,但我不排除是愚蠢的并且在那里有问题:就像我说的,我不太了解 C/C++。
C# 包装器方法中的数字变量值不会改变。请帮忙。
我认为您的结果很糟糕,因为在您的 C++ 代码中,您实际上是通过将参数 number
设置为另一个指针来更改它。
我相信您的更改只会在您的函数 outTest
的范围内可见。
但是,如果您更改指针……指向……的值,那就另当别论了。差不多是这样的:
*number = *number + 10;
编辑:该位未经测试。哦……还有……我已经很久没有用 C++ 写过任何东西了。也可能是完全错误的。
我正在将本机 C++ DLL 编组为 C# DLL。我在 C/C++ 中不是很受认可,但在我遇到这个问题之前我已经设法让它工作了。这是一个非常简单的代码示例:
C++
PROASADLL __declspec(dllexport) void outTest(int* number){
int temp = *number + 10;
number = &temp; //*number = 12
}
C#
[DllImport("ProAsaNativeDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void outTest(ref int number);
public static int OutTest()
{
int number = 2;
outTest(ref number);
return number; //number = 2
}
请注意,我是我的真实场景,我试图让它与指向结构的指针一起工作,但我决定将其排除在外,因为这不是编组问题;即使是这个简单的代码也行不通。 C++ 代码可以工作,但我不排除是愚蠢的并且在那里有问题:就像我说的,我不太了解 C/C++。
C# 包装器方法中的数字变量值不会改变。请帮忙。
我认为您的结果很糟糕,因为在您的 C++ 代码中,您实际上是通过将参数 number
设置为另一个指针来更改它。
我相信您的更改只会在您的函数 outTest
的范围内可见。
但是,如果您更改指针……指向……的值,那就另当别论了。差不多是这样的:
*number = *number + 10;
编辑:该位未经测试。哦……还有……我已经很久没有用 C++ 写过任何东西了。也可能是完全错误的。