需要帮助定制编组..?

时间:2010-02-06 14:34:59

标签: c# interop pinvoke dllimport

我需要有关自定义编组的帮助..我有一个原生DLL ..一些DLL函数的参数是用unsigned char *定义的

例如

;

typedef short apiStatus;
    apiStatus __declspec(dllexport) __stdcall DrfGetFirmwareVersion (HANDLE hCom, unsigned char *major,unsigned char *minor, unsigned char ReaderAddr = 0xff); 

我描述函数参数的文档如下;

输入参数:

  • hCom-串口手柄
  • 固件程序的主要版本号
  • minor-subversion固件程序编号
  • ReaderAddr-阅读器地址,适用于固定阅读器RS485网络应用程序,默认值“0XFF”(不适用于手持设备和模块)

如何将此函数声明为C#.. ??

任何帮助都会非常感激

2 个答案:

答案 0 :(得分:1)

如果这个DLL真的非常老(当char仍未签名时返回)那么它可能会返回字符串。但这很不可能,只需将它们声明为out byte:

[DllImport("blah.dll")]
private static extern noidea DrfGetFirmwareVersion(IntPtr handle, 
   out byte major, out byte minor, byte address);

其中“noidea”可能是无效的或某种int错误代码。另一件需要担心的是DllImport.CallingConvention属性,它可能是Cdecl。当您收到有关堆栈不平衡的MDA警告时使用它。不要忘记将项目的平台目标设置为x86,否则它将在64位操作系统上轰炸。

答案 1 :(得分:0)

我已经使用overloed作为默认参数(VS2005).i导入了如下函数;

public class sDrfGetFirmwareVersion
        {
            //apiStatus __declspec(dllexport) __stdcall DrfGetFirmwareVersion (HANDLE hCom, unsigned char *major,unsigned char *minor, unsigned char ReaderAddr = 0xff);

            [DllImport("DrfApiV10.dll", CallingConvention = CallingConvention.StdCall,CharSet=CharSet.Ansi,EntryPoint="DrfGetFirmwareVersion", ExactSpelling=false)]
            public static extern short DrfGetFirmwareVersion(IntPtr hCom, out byte major, out byte minor,byte ReaderAddr);
            public static short DrfGetFirmwareVersion(IntPtr hCom, out byte major,out byte minor)
              {
                  return DrfGetFirmwareVersion(hCom, out major,out minor, 0xff);
              }
        }
你可以验证我吗?