неподдерживаемая функция MONO "System.Security.Principal.WindowsIdentity.GetCurrent (bool)" с использованием UNITY3D и MATLAB's MWARRAY.DLL - PullRequest
3 голосов
/ 16 января 2012

проблема начинается с вызова функции для монофонической функции, которая еще не поддерживается. вызов сделан из библиотеки DLL с близким matlab, которая называется MWARRAY.DLL (.net версии 2.x), эта dll обычно используется с VS .NET и работает, если вы используете .net 3.5.

функция: [mscorlib] System.Security.Principal.WindowsIdentity :: GetCurrent (bool)

Я могу придумать несколько возможных решений, но я не уверен, как их сделать:

  1. декомпилировать dll и заменить байт-код аналогичной и работающей функцией: [mscorlib] System.Security.Principal.WindowsIdentity :: GetCurrent () обратите внимание, что в функцию не передано логическое значение
  2. скомпилируйте моно и напишите функцию самостоятельно
  3. , используя старую версию MWARRAY.DLL (не может найти, но может использовать тот же код)

для декомпиляции я использовал IDA. я нашел место, где есть вызов первой функции, CIL + HEX ниже

loc_38B1:    
ldsfld  native     
int [mscorlib]System.IntPtr::Zero   
stloc.s 7    
ldc.i4.0
stloc.s 8
ldc.i4.1
stloc.s 9
ldc.i4.1
call    class [mscorlib]System.Security.Principal.WindowsIdentity::GetCurrent(bool)
stloc.s 0xA
call    void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::PrepareConstrainedRegions()
  .try {
ldc.i4.0
stloc.s 0xB
br      loc_3982

HEX команд call и stloc:

28 96 00 00 0A 

я также скомпилировал и декомпилировал свою собственную dll с вызовами обеих функций, просто чтобы посмотреть, как другая команда выглядит в байт-коде:

loc_3AE:
call    class [mscorlib]System.Security.Principal.WindowsIdentity [mscorlib]System.Security.Principal.WindowsIdentity::GetCurrent()
callvirt class System.String [mscorlib]System.Security.Principal.WindowsIdentity::get_Name()
stloc.s 8
ldc.i4.1

шестнадцатеричный код скомпилированных / декомпилированных строк, выделенных жирным шрифтом:

28  00 00 0A 6F 1B 00 00 0A  13 08 17

Я хотел бы знать, есть ли у кого-нибудь идея предлагаемых путей решения или что-нибудь еще, что может прийти в голову?

1 Ответ

2 голосов
/ 17 января 2012

это было решено.

Используя .net отражатель для извлечения mwarray.dll, можно изменить код изнутри Visual Studio.

в классе MCR () в строке 330 тамэто вызов getcurrent ().заменить на = ноль;

...