当前位置: 首页 > 知识库问答 >
问题:

C# 封送处理 ushort/ulong 数组

蒋斯伯
2023-03-14

我有一个C-DLL头html" target="_blank">文件,并尝试从C#调用函数。我还有一些如何使用该函数的示例C代码。以下是函数定义:

int GetData(unsigned char* buffer, long bufferSize);

更有趣的是示例代码以及如何调用函数:

if(dataSize == 16)
{
  unsigned short* usData = new unsigned short[m_numX * m_numY * 3 / 2];
  GetData( (unsigned char*)usData, m_numX * m_numY * sizeof(unsigned short)  );
} 
else if (dataSize == 32) 
{
  unsigned long* ulData = new unsigned long[m_numX * m_numY];
  GetData( (unsigned char*)ulData, m_numX * m_numY * sizeof(unsigned long)  );
}

因此,根据dataSize变量,实际的数据数组可以是ushort或ulong。但是,它总是作为无符号char指针传递。为了简单起见,我只是尝试让至少一个变体工作。这是我为dataSize=16尝试的代码

[DllImport("External.dll", EntryPoint = "GetData", CharSet = CharSet.Unicode, CallingConvention =      CallingConvention.Cdecl)]
public static extern int GetData(ref ushort[] pBuffer, long lBufferSize);

long bufferSize1 = numX * numY * 3 / 2;
long bufferSize2 = numX * numY * sizeof(ushort);
ushort[] data = new ushort[bufferSize1];

GetData(ref data, bufferSize2)

如果我运行以上代码,应用程序将退出,并出现“访问冲突”异常。这通常意味着,不安全的代码试图写入缓冲区限制,或者p/invoke声明有错误。我尝试了巨大的缓冲区(它可以保存我所期望的任何类型的数据),但我的猜测是,我的错误在声明中。

我还尝试在p/invoke声明中将缓冲区声明为byte[](因为该示例将其转换为无符号char*)和ulong。我作为引用传递的实际缓冲区也是如此。错误保持不变。

我怎样才能做到这一点?

共有1个答案

严嘉良
2023-03-14

有几个错误:

    < li >数组不能作为< code>ref传递。这是因为< code>ref ushort[]与< code>unsigned short**匹配。 < li>C long与Windows上的C# long不匹配。前者是32位,后者是64位。

您需要像这样导入:

[DllImport("External.dll", CallingConvention =      CallingConvention.Cdecl)]
public static extern int GetData(
    [Out] ushort[] pBuffer, 
    int lBufferSize
);

为方便起见,对 32 位数据变体使用重载是完全合理的:

[DllImport("External.dll", CallingConvention =      CallingConvention.Cdecl)]
public static extern int GetData(
    [Out] uint[] pBuffer, 
    int lBufferSize
);

同样,如果需要,字节数组的重载也会有效。

 类似资料:
  • 问题内容: 我有许多需要自定义编组的结构。在测试时,我使用的是JSON和标准的JSON marshaller。由于它不会封送未导出的字段,因此我需要编写一个自定义的MarshalJSON函数,该函数运行良好。当我在父结构上调用json.Marshal时,该结构包含需要自定义编组的字段,它工作正常。 现在,我需要将所有内容封送给BSON进行MongoDB的工作,而我找不到任何有关如何编写自定义BSO

  • 我有一个关于通过JAXB封送的小问题。 当前我有一个对象的HashMap 由自定义HashMapAdapter封送的being 封送基于以下文章:http://blog.bdoughan.com/2013/06/moxys-xmlvariableNode-using-maps-key-as.html HashMap由布尔值、长值或字符串值填充。 因此,关于Blog,预期的JSON输出应该是: 西蒙

  • 问题内容: 在过去的几天中,我尝试使用MOXy JAXB支持对Hibernate模型的XML编组/解组。尝试执行此操作时,我遇到了hibernate代理对象的问题。考虑类似: 我尝试通过以下方式使用MOXy JAXB映射此代码: 我的问题是,hibernate实例化了通过在User上调用getAddress()获得的地址的代理对象。然后,当JAXB尝试封送对象时,它无法发现它实际上是它要封送的Co

  • 问题内容: 我正在尝试找到一种方法来以最少的工作量完成xsd模式到数据存储往返。 我使用jaxb从架构中构建对象模型,现在我想基于JPA(或JDO或其他东西?)存储这些对象。是否有可能基于JAXB注释自动增强缺少注释的对象?是可取的吗? 谢谢 问题答案: 对于此用例,您有几种选择。 选项#1-Hyperjaxb3 我自己没有使用过,但是Hyperjaxb3应该在模型上生成JAXB和JPA批注: h

  • 问题内容: 如何从外部包向结构添加自定义JSON封送处理?我无法将和添加到这些结构中。 问题答案: 您可以将该结构添加到您定义的结构中。然后添加功能,并给你的结构: