DllImport a c++ DLL in a C# app, BYTE * p

Posted

技术标签:

【中文标题】DllImport a c++ DLL in a C# app, BYTE * p【英文标题】:DllImport a c++ DLL in to a C# app, BYTE * p 【发布时间】:2009-10-21 21:41:55 【问题描述】:

我在 c++ DLL 中有一个导出函数

// C++ DLL (Blarggg.dll)

extern "C"

     USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID ) 
    
         if( invokeID != NULL ) 
            * invokeID = 10 ; 
        
         return 0;
    

我想让它在我的 C# 应用程序中可用

// C# app 
[DllImport("Blarggg.dll")]
public static extern System.UInt16 ReadProperty(
        /* [OUT] */ System.Byte[] message,
        /* [IN]  */ System.UInt16 length,
        /* [OUT] */ System.Byte[] invokeID ); 


private void DoIt() 

    System.Byte[] message = new System.Byte[2000];
    System.Byte[] InvokeID = new System.Byte[1];
    System.UInt16 ret = ReadProperty( message, 2000, InvokeID ); // Error 

问题是我不断收到以下错误消息。

Blarggg.dll 中发生了“System.NullReferenceException”类型的未经处理的异常 附加信息:对象引用未设置为对象的实例。

我正在使用 VS2008 来构建 DLL 和 C# 应用程序。

我不是 C# 程序员

我做错了什么?

【问题讨论】:

【参考方案1】:

我将您的代码直接粘贴到 VS2008 中,它在我的 32 位机器上完美运行(添加了一个 .def 文件来设置导出的名称)。 你的 C++ 库绝对是纯 win32 项目吗?您给出的错误消息似乎暗示它引发了 CLR 异常。

【讨论】:

我将当前项目中的代码复制到了一个新项目中,并且能够毫无问题地编译和运行它。它必须与项目或我的应用程序的另一部分有关。谢谢。【参考方案2】:

试试这个:

[DllImport("Blarggg.dll", CallingConvention := CallingConvention.Cdecl)] 
public static extern System.UInt16 ReadProperty( 
        /* [IN]  */ System.Byte[] message, 
        /* [IN]  */ System.UInt16 length, 
        /* [OUT] */ out System.Byte invokeID );  


private void DoIt()  
 
    System.Byte[] message = new System.Byte[2000]; 
    System.Byte InvokeID; 
    System.UInt16 ret = ReadProperty( message, 2000, out InvokeID );
 

【讨论】:

【参考方案3】:

您可能需要使用System.Runtime.InteropServices.Marshal class 在托管类型和非托管类型之间进行转换。

【讨论】:

【参考方案4】:

你能用 C++ 类型做到这一点吗?

我的印象是您只能 DLLImport C dll。

我们将 DLLImport 与 C++ Dll 一起使用很好,但我们将外部函数声明为

extern "C" __declspec(dllexport) ...

看看这个网页:

http://dotnetperls.com/dllimport-interop

【讨论】:

我应该提到 (BYTE = unsigned char, USHORT = unsigned short) 都是 C 数据类型。 我在问题中添加了 extern "C",它在我的原始代码中,但它确实有助于解决这个问题。 你绝对可以 DLLImport C++ dll's,'extern C' 只是为了避免名称混淆,你可以用另一种方式完成同样的事情。 您是否也将 C++ 函数声明为 __declspec(dllexport) ?

以上是关于DllImport a c++ DLL in a C# app, BYTE * p的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以调试从 C# DllImport 调用的 c++ dll?

Unity与DLL(C++)☀️一[DLLImport]是 Unity 与 DLL 沟通的桥梁

对于我的自定义 C++ DLL,我的 C# 项目中的 DLLImport(s) 有啥问题?

C#DllImport传参

调用从 c# 返回 char* 的 c++ dll 函数。无法使用 DllImport()

DLLImport a variable MFC dll