C# 平沃克问题

C# 平沃克问题,c#,pinvoke,C#,Pinvoke,这是本机c方法的签名: bool nativeMethod1 (unsigned char *arrayIn, unsigned int arrayInSize, unsigned char *arrayOut, unsigned int *arrayOutSize); 我不知道为什么arrayOutSize是指向无符号int的指针,而不是int本身 这就是我从C#调用它的方式: 还有一些DllImportcode [DllImport(@"IcaCert.dll", EntryPoint =

这是本机c方法的签名:

bool nativeMethod1
(unsigned char *arrayIn,
unsigned int arrayInSize,
unsigned char *arrayOut,
unsigned int *arrayOutSize);
我不知道为什么arrayOutSize是指向无符号int的指针,而不是int本身

这就是我从C#调用它的方式:

还有一些
DllImport
code

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]<br>
public unsafe static extern bool CreateCert2WithArrays(
        byte* data, uint dataSize,<br>
        byte* result, uint[] resultSize);
[DllImport(@“IcaCert.dll”,EntryPoint=“CreateCert2”,CallingConvention=CallingConvention.Cdecl)]
公共不安全静态外部布尔CreateCert2WithArray( 字节*数据,uint数据大小,
字节*结果,uint[]结果大小);

根据文档,本机方法应该返回arrayOut,并根据arrayIn返回值。如果其大小小于所需大小,则返回false。反之亦然。我估计它需要850个元素。所以,当我创建新的字节[100]数组时,函数应该返回false,但它总是返回true。为什么?

您不需要不安全的代码并在此处修复。标准P/Invoke封送拆收器完全可以执行以下任务:

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CreateCert2WithArrays(
    byte[] arrayIn, 
    uint arrayInSize,
    byte[] arrayOut,
    ref uint arrayOutSize
);

byte[] arrayIn = Encoding.UTF8.GetBytes(source);
uint arrayInSize = (uint)arrayIn.Length;
uint arrayOutSize = 0;

CreateCert2WithArrays(arrayIn, arrayInSize, null, ref arrayOutSize);
byte[] arrayOut = new byte[arrayOutSize];
CreateCert2WithArrays(arrayIn, arrayInSize, arrayOut, ref arrayOutSize);

我不知道函数的协议是什么,但是如果输出数组的大小为0,这些函数能够接收
NULL
,这是正常的。

您不需要不安全的代码,并在这里修复。标准P/Invoke封送拆收器完全可以执行以下任务:

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CreateCert2WithArrays(
    byte[] arrayIn, 
    uint arrayInSize,
    byte[] arrayOut,
    ref uint arrayOutSize
);

byte[] arrayIn = Encoding.UTF8.GetBytes(source);
uint arrayInSize = (uint)arrayIn.Length;
uint arrayOutSize = 0;

CreateCert2WithArrays(arrayIn, arrayInSize, null, ref arrayOutSize);
byte[] arrayOut = new byte[arrayOutSize];
CreateCert2WithArrays(arrayIn, arrayInSize, arrayOut, ref arrayOutSize);

我不知道函数的协议是什么,但是如果输出数组的大小为0,这些函数能够接收
NULL
,这是正常的。

我认为数组不是您想要的。它是指向数组大小的指针,而不是指向大小数组的指针。试试这个:

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern bool CreateCert2WithArrays(
byte* data, uint dataSize,
byte* result, ref uint resultSize);

byte[] arrayIn= Encoding.UTF8.GetBytes(source);

uint arrayInSize = (uint)arrayIn.Length;
byte[] arrayOut = new byte[100];
uint arrayOutSize = (uint)arrayOut.Length; 
CreateCert2WithArrays (arrayIn, (uint) arrayIn.Length, arrayOut, ref arrayOutSize);
uint[] arrayOutSize = new uint[1];
arrayOut = new byte[(int)arrayOut];
CreateCert2WithArrays (arrayIn, (uint) arrayIn.Length, arrayOut, ref arrayOutSize);

我不认为数组是你要找的。它是指向数组大小的指针,而不是指向大小数组的指针。试试这个:

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern bool CreateCert2WithArrays(
byte* data, uint dataSize,
byte* result, ref uint resultSize);

byte[] arrayIn= Encoding.UTF8.GetBytes(source);

uint arrayInSize = (uint)arrayIn.Length;
byte[] arrayOut = new byte[100];
uint arrayOutSize = (uint)arrayOut.Length; 
CreateCert2WithArrays (arrayIn, (uint) arrayIn.Length, arrayOut, ref arrayOutSize);
uint[] arrayOutSize = new uint[1];
arrayOut = new byte[(int)arrayOut];
CreateCert2WithArrays (arrayIn, (uint) arrayIn.Length, arrayOut, ref arrayOutSize);

为什么您使用不安全的代码和修复。这里不需要。但是我使用byte*指针,它需要是不安全的,而且,这部分byte*ptrIn=arrayIn需要固定的。你不需要使用
byte*
-请看我的回答。你不能使用固定的关键字来生成传递给本机代码的指针,数组没有固定。大卫的声明是正确的。使用Project+属性调试本机代码,调试,启用非托管代码调试。为什么要使用不安全的代码和修复。这里不需要。但是我使用byte*指针,它需要是不安全的,而且,这部分byte*ptrIn=arrayIn需要固定的。你不需要使用
byte*
-请看我的回答。你不能使用固定的关键字来生成传递给本机代码的指针,数组没有固定。大卫的声明是正确的。使用Project+属性调试本机代码,调试,启用非托管代码调试。我知道它会起作用,我的也适用于正常的ArrayoutSize。但我好奇的是,如果arrayOutSize小于所需大小,为什么它不起作用。它应该返回false,但它不会。我用C++检查了它,如果ArayAuthSead小于需要,它总是返回false。我没有概念。本机代码是正确的,我用java和C++测试了它,只有C·{失效的人说,你的原始代码是错误的。上面的代码是如何做到这一点。从这里开始,向前看。你不需要在arrayIn&arrayOut上设置MarshalAsAttribute.SizeParamIndex属性吗?@Simon我不这么认为,因为分配是在C端完成的。我知道这会起作用,我的也适用于正常的ArrayoutSize。但我好奇的是,如果arrayOutSize小于所需大小,为什么它不起作用。它应该返回false,但它不会。我用C++检查了它,如果ArayAuthSead小于需要,它总是返回false。我没有概念。本机代码是正确的,我用java和C++测试了它,只有C·{失效的人说,你的原始代码是错误的。上面的代码是如何做到这一点。从这里开始,向前看。你不需要在arrayIn&arrayOut上设置MarshalAsAttribute.SizeParamIndex属性吗?@Simon我不这么认为,因为分配是在C端完成的。