2015-09-23 5 views
0

Я недавно только начал заниматься сборкой IL .NET, у меня есть предварительные знания PowerPC уже, поэтому я понимаю основы, но то, что я не могу понять, как ссылаться и вызова методов в .DLLМетод вызова из .dll в IL. NET

То, что я получил до сих пор в моем проекте IL является

.assembly extern mscorlib {} 
.assembly extern PS3Lib {} 
.assembly Test {} 
.module Test.exe 

.class Test.Program 
extends [mscorlib]System.Object 
{ 
    .method static void Main(string[] args) cil managed 
    { 
     .entrypoint 

     ldstr "Connecting to PS3.." 
     call void [mscorlib]System.Console::WriteLine(string) 

     ldc.i4 0 
     call bool [PS3Lib]PS3API::ConnectTarget(int32) 

     ret 
    } 
} 

PS3Lib это библиотека Я пытаюсь использовать

и в нашем .dll у нас есть что-то вроде этого (только включая части, которые я верю е необходимы)

namespace PS3Lib 
{ 
    public class PS3API 
    { 
     public enum SelectAPI 
     { 
      ControlConsole, 
      TargetManager 
     } 
     public PS3API(SelectAPI API = SelectAPI.TargetManager) 
     { 
      PS3API.SetAPI.API = API; 
      this.MakeInstanceAPI(API); 
     } 
     public bool ConnectTarget(int target = 0) 
     { 
      this.MakeInstanceAPI(this.GetCurrentAPI()); 
      bool result; 
      if (PS3API.SetAPI.API == SelectAPI.TargetManager) { 
       result = PS3API.Common.TmApi.ConnectTarget(target); 
      } 
      else { 
       result = new PS3API.ConsoleList(this).Show(); 
      } 
      return result; 
     } 
    } 
} 

Спасибо

+3

Легкий способ открыть для себя правильный MSIL: Запишите это в C# и использовать 'ildasm' (или .NET Reflector в Режим «MSIL») –

ответ

0
  • ConnectTarget это метод экземпляра, но вы не толкал его экземпляр в стек оценки перед вызовом.
  • ConnectTarget оставит bool в стеке оценки, но ret ожидает, что единственное значение в стеке оценки - результат, возвращаемый или пустой, если метод возвращает void. Поскольку ваш метод возвращает void, вы должны сначала его вытащить.
  • Я уверен, что вам нужно ссылаться на типы по их полному имени.

Попробуйте что-то вроде этого (с верхней части моей головы - не тестировалось):

ldc.i4.1 
newobj [PS3Lib]PS3Lib.PS3API::.ctor([PS3Lib]PS3Lib.PS3API/SelectAPI) 
ldc.i4 0 
call bool [PS3Lib]PS3Lib.PS3API::ConnectTarget(int32) 
pop 

ret 
Смежные вопросы