我有一个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。我作为引用传递的实际缓冲区也是如此。错误保持不变。
我怎样才能做到这一点?
有几个错误:
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封送处理?我无法将和添加到这些结构中。 问题答案: 您可以将该结构添加到您定义的结构中。然后添加功能,并给你的结构: