Можно ли вызвать неуправляемый код, используя отражение C # от управляемого кода? - PullRequest
5 голосов
/ 02 июня 2010

Возможно ли использование рефлексии и C # .NET для вызова динамически другой функции (с аргументами), написанной на C или C ++ до появления .NET (неуправляемый код)?

И смелый пример C #, если это возможно, был бы признателен!

Спасибо!

Br, Милан.

Ответы [ 3 ]

3 голосов
/ 02 июня 2010

Отражение работает только с управляемым кодом.

В зависимости от того, что на самом деле представляет собой неуправляемый код, вы можете использовать COM-взаимодействие (для компонентов com) или PInvoke (для dll's старого стиля) для вызова неуправляемого кода. Возможно, вы можете написать обертку вокруг неуправляемого кода, чтобы сделать это возможным.

3 голосов
/ 02 июня 2010

Да, динамический P / Invoke возможен в .NET с использованием Marshal.GetDelegateForFunctionPointer. См. Следующий пример, взятый из раздела Делегаты и неуправляемые указатели функций из статьи Написание небезопасного кода на C # 2.0 Патрика Смаккья:

using System;
using System.Runtime.InteropServices;
class Program
{
     internal delegate bool DelegBeep(uint iFreq, uint iDuration);
     [DllImport("kernel32.dll")]
     internal static extern IntPtr LoadLibrary(String dllname);
     [DllImport("kernel32.dll")]
     internal static extern IntPtr GetProcAddress(IntPtr hModule,String procName);
     static void Main()
     {
          IntPtr kernel32 = LoadLibrary( "Kernel32.dll" );
          IntPtr procBeep = GetProcAddress( kernel32, "Beep" );
          DelegBeep delegBeep = Marshal.GetDelegateForFunctionPointer(procBeep , typeof( DelegBeep ) ) as DelegBeep;
          delegBeep(100,100);
     }
}

Существует также другой метод, описанный Junfeng Zhang, который также работает в .NET 1.1:

Dynamic PInvoke

0 голосов
/ 02 июня 2010

Нет, отражение только для управляемого кода.

...