2013-09-08 3 views
2

Если мне известен адрес метода, который я хочу вызвать в другом процессе (C++), как я могу это сделать на C#?Вызвать метод работающего процесса

Смещение метода всегда такое же.

Мой текущий код:

struct DataToPass 
{ 
    int field; 
} 

delegate void Caller(DataToPass data); 

public void Call() 
{ 
    DataToPass data = new DataToPass(); 
    data.field = 12345; 

    IntPtr callptr = new IntPtr(myprocess.Modules[0].BaseAddress.ToInt32() + 0x3A5582); 
    Caller call = (Caller)Marshal.GetDelegateForFunctionPointer(callptr, typeof(Caller)); 
    call(data); 
} 

Но когда я запускаю программу, я получаю сообщение об ошибке:

An unhandled exception of type 'System.AccessViolationException' occurred in testcall.exe

+3

Вы пытаетесь написать вирус на C#? Какую проблему ты пытаешься решить? – oleksii

+1

@oleksii C# вирусы - последняя горячая тенденция, я думаю. –

+0

Я написал маленького помощника клиента для игры для нашего игрового сервера. Я изменил некоторые значения (настройки автомобиля и т. Д.), Но я должен вызвать функцию в игре, чтобы пересчитать новые значения. – user2759203

ответ

6

Вы адресности адрес метода в удаленном процессе и пытается вызвать что бы ни случилось в одном и том же адресе в вашем процессе. На самом деле вам повезло, что вы получили AccessViolation.

Прежде всего вам нужно решить, должен ли метод работать в вызывающем или удаленном. Если он должен запускаться в вызывающем процессе, проще просто ссылаться на DLL/EXE, где находится метод и вызывать его. Но если вы хотите, чтобы он запускался в удаленном процессе, вы можете использовать некоторую форму удаленного доступа, такую ​​как WCF.