2009-10-21 46 views
2

我有一个C一个导出函数++ DLL在一个C#应用程序,BYTE * P

// C++ DLL (Blarggg.dll) 

extern "C" 
{ 
    USHORT ReadProperty(BYTE * messsage, USHORT length, BYTE * invokeID) 
    { 
     if(invokeID != NULL) { 
      * invokeID = 10 ; 
     } 
     return 0; 
    } 
} 

,我想将其提供给我的C#应用​​程序的DllImport一个C++ DLL

// 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 
} 

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

类型“System.NullReferenceException”的unhanded异常出现在Blarggg.dll 其他信息:对象没有设置为一个对象的一个​​实例。

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

我不是C#程序员。

我在做什么错?

回答

2

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

+0

我将当前项目中的代码复制到一个新项目中,并且能够编译并运行任何问题。它必须与我的应用程序或另一部分应用程序有关。 谢谢。 – 2009-10-21 23:35:54

0

你可以用C++类型来做到这一点吗?

我的印象是,你只能DLLImport C DLL。

我们使用的DllImport使用C++ DLL的就好了,但是我们宣布我们的外部函数

extern "C" __declspec(dllexport) ... 

看一看这个网页:

http://dotnetperls.com/dllimport-interop

+0

我应该提到,(BYTE =无符号字符,USHORT =无符号短)两者都是C数据类型。 – 2009-10-21 22:19:48

+0

我将extern“C”添加到问题中,它是在我的原始代码中,但它对此问题有帮助。 – 2009-10-21 22:22:43

+0

你绝对可以DLLImport C++ dll的,'extern C'仅仅是为了避免名字混乱,你可以用另一种方式完成同样的事情。 – 2009-10-21 22:28:05

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); 
} 
相关问题