Действительно ли возможно назвать неуправляемый код с помощью отражения C# из управляемого кода?

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

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

Спасибо!

Бром, Милан.

5
задан milan 2 June 2010 в 11:57
поделиться

3 ответа

Да, динамический вызов 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);
     }
}

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

Dynamic PInvoke

3
ответ дан 14 December 2019 в 13:27
поделиться

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

0
ответ дан 14 December 2019 в 13:27
поделиться

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

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

3
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: