Использование внешних функций в зависимости от kernel32.dll с Mono - PullRequest
0 голосов
/ 24 апреля 2020

Я портирую приложение C# (. NET Framework 4.6.1) на GNU / Linux. Я использовал Mono для его сборки и запуска. Приложение работает нормально, за исключением некоторых частей. А именно, когда требуется импорт некоторых DLL (user32.dll, kernel32.dll), потому что, очевидно, это Windows speci c и Mono не включает их. Например, в коде у меня есть следующие extern функции, относящиеся к kernel32.dll:

[DllImport("kernel32.dll")]
static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess,
  bool bInheritHandle, uint dwThreadId);

[DllImport("kernel32.dll")]
static extern uint SuspendThread(IntPtr hThread);

[DllImport("kernel32.dll")]
static extern int ResumeThread(IntPtr hThread);

[DllImport("kernel32.dll")]
static extern bool CloseHandle(IntPtr hObject);

[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccess dwDesiredAccess,
  bool bInheritHandle, int dwProcessId);

[DllImport("kernel32.dll")]
static extern bool ReadProcessMemory(IntPtr hProcess,
  UIntPtr lpBaseAddress, byte[] lpBuffer, IntPtr dwSize, ref int lpNumberOfBytesRead);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress,
  byte[] lpBuffer, IntPtr dwSize, ref int lpNumberOfBytesWritten);

[DllImport("kernel32.dll")]
static extern IntPtr VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress,
  out MemoryBasicInformation lpBuffer, IntPtr dwLength);

Когда один из этих методов вызывается с помощью Mono, я получил ошибку, подобную этой (пример для CloseHandle):

[ERROR] FATAL UNHANDLED EXCEPTION:
System.EntryPointNotFoundException: CloseHandle assembly:<unknown assembly> type:<unknown type> member:(null)
  at (wrapper managed-to-native) MyProject.Utilities.Kernel32NativeMethods.CloseHandle(intptr)
  at MyProject.Utilities.Kernel32NativeMethods.CloseProcess (System.IntPtr processHandle) [0x00001] in <38a03fe220d245f3b3d5e7486135e053>:0 
  at MyProject.Utilities.WindowsProcessRamIO.Dispose (System.Boolean disposing) [0x0003f] in <38a03fe220d245f3b3d5e7486135e053>:0 
  at MyProject.Utilities.WindowsProcessRamIO.Finalize () [0x00002] in <38a03fe220d245f3b3d5e7486135e053>:0

Я понимаю ошибку (вызов монофонического метода невозможен в Mono), но я хотел бы знать, есть ли способ конвертировать эти методы, чтобы избежать зависимости на внешних библиотеках, таких как kernel32.dll.

Я проверил PInvoke , но, к сожалению, нет неуправляемых замен для этих методов.

Есть ли способ переписать этот код быть совместимым с Mono? Или, может быть, включить что-то, чтобы воспроизвести поведение отсутствующих DLL?

1 Ответ

0 голосов
/ 24 апреля 2020

kernel32.dll указан c для Windows и недоступен на других платформах. Эти API-интерфейсы ограничены только для Windows.

Вам необходимо переписать свой код, чтобы избежать использования этих функций. Смотрите классы System.Threading.Thread и Diagnostics.Process, возможно, в них есть все, что вам нужно.

...