首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PInvoke问题

PInvoke问题
EN

Stack Overflow用户
提问于 2011-06-19 23:18:20
回答 2查看 393关注 0票数 1

这是本机c方法的签名:

代码语言:javascript
复制
bool nativeMethod1
(unsigned char *arrayIn,
unsigned int arrayInSize,
unsigned char *arrayOut,
unsigned int *arrayOutSize);

我不知道为什么arrayOutSize是指向无符号整数的指针,而不是指向整数本身的指针。

下面是我从C#调用它的方式:

代码语言:javascript
复制
byte[] arrayIn= Encoding.UTF8.GetBytes(source);
uint arrayInSize = (uint)arrayIn.Length;
byte[] arrayOut = new byte[100];
uint[] arrayOutSize = new uint[1];
arrayOutSize[0] = (uint)arrayOut.Length;

fixed (byte* ptrIn = arrayIn, ptrOut = arrayOut)
{
    if (nativeMethod1(ptrIn, arrayInSize, ptrOut, arrayOutSize))
    {
        Console.WriteLine("True");
    }
    else
    {
        Console.WriteLine("False");
    }
}

和一些DllImport代码

代码语言:javascript
复制
[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]<br>
public unsafe static extern bool CreateCert2WithArrays(
        byte* data, uint dataSize,<br>
        byte* result, uint[] resultSize);

根据文档,本机方法应该返回根据arrayIn的值实现的arrayOut。如果它的大小小于所需的大小,则返回false。事实并非如此。我计算出在arrayOut中需要850个元素。因此,当我创建新的byte100数组时,函数应该返回false,但它总是返回true。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-19 23:31:53

你不需要不安全的代码并在这里修复。标准的P/Invoke编组程序完全可以完成任务:

代码语言:javascript
复制
[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是正常的。

票数 4
EN

Stack Overflow用户

发布于 2011-06-19 23:34:09

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

代码语言:javascript
复制
[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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6403243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档