1 Mart 2018 Perşembe

DllImport Anotasyonu

Giriş
Şu satırı dahil ederiz.
using System.Runtime.InteropServices;
Bu kelime .Net olmayan bir Dll'den metod kullanabilmemizi sağlar. Metodun başına static extern eklenir ve daha sonra metodun imzası eksiksiz yazılır. Dll içindeki metodları görmek için dumpbin komutu kullanılaiblir.

Eğer DLL bulunamazsa DllNotFoundException atılır.

1. Hiçbir Alan Belirtmemek
Şöyle yaparız.
class ExternalDllSubClass
{
    [DllImport("my.dll")]
    private static extern void print_line(string str);

    internal static void PrintLine (string str) {
        print_line(str);
    }
}
2. CallingConvention Alanı- C tarzı metodlar
Örnek
Dll içindeki metod C calling convention ile kodlanmış olabilir. C calling convention'da çağıran metod stack'i temizler. Windows calling convention'da çağrılan metod stack'i temizler.
extern "C" __declspec(dllexport) int Add(int a, int b)
{
    return a + b;
}
Bu durumda şöyle tanımlarız.
[DllImport("CommonNativeLib.dll"),CallingConvention = CallingConvention.Cdecl)]
extern public static int Add(int a, int b);
Örnek
Elimizde şöyle bir kod olsun.
extern "C" __declspec(dllexport) int __cdecl test();
Şöyle yaparız.
[DllImport("Api.dll", EntryPoint = "test", CharSet = CharSet.Ansi, 
  CallingConvention = CallingConvention.Cdecl)]
internal static extern Int32 test();
3. CharSet Alanı
Şöyle yaparız.
[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, 
  LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
Şöyle yaparız.
[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
4. EntryPoint Alanı
Örnek
Eğer C# metodunun ismini farklı vermek istesek EntryPoint te tanımlanabiliyor.
Örnek
Şöyle yaparız.
[DllImport("MyDll32.dll", EntryPoint = "Func1", 
                          CallingConvention = CallingConvention.Cdecl)]
private static extern int Func1_32(int var1, int var2);
Örnek
Elimizde şöyle bir kod olsun.
#include "Source.h"

void PiblRequestCallback(PibMsgConf &msg, void *param)
{
  cout << "In PibRequestCallback" << endl;
}

uint32_t GetPib() 
{

  return 25;
}
Şöyle yaparız
[DllImport("socket.dll", EntryPoint = "getpib")]
public static extern UInt32 GetPib();

Hiç yorum yok:

Yorum Gönder