нужна помощь пользовательского маршалинга ..? - PullRequest
0 голосов
/ 06 февраля 2010

мне нужна помощь по поводу пользовательского маршалинга .. у меня есть собственная 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 handle Ручка последовательного порта
  • Major - Основной номер версии программы прошивки
  • Незначительный - Subversion № программы прошивки
  • Адрес считывателя ReaderAddr-, для стационарного считывателя Сетевое приложение RS485, значение по умолчанию «0XFF» (неприменимо для портативного устройства и модуля)

как я могу объявить эту функцию в C # .. ??

Любая помощь будет очень признательна

Ответы [ 2 ]

1 голос
/ 06 февраля 2010

Если эта DLL действительно очень старая (еще тогда, когда char еще не подписан), то она может возвращать строки. Это довольно маловероятно, просто объявите их как байты:

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

Там, где «noidea», по-видимому, недействителен, или какой-то код ошибки типа int. Еще одна вещь, о которой стоит беспокоиться, это свойство DllImport.CallingConvention, это может быть Cdecl. Используйте это, когда вы получаете предупреждение MDA о дисбалансе стека. И не забудьте установить Platform Target вашего проекта на x86, иначе он будет бомбить на 64-битных операционных системах.

0 голосов
/ 06 февраля 2010

Я использовал overloed для параметра по умолчанию (VS2005). Я импортировал функцию следующим образом;

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);
              }
        }

Можете ли вы подтвердить мне, пожалуйста?

...