c#中動態裝載dll

來源:互聯網
上載者:User

記得很久前有個人讓我解決這麼一個事情,他的一個c動態串連庫裡面有個靜態變數,每次調用這個方法的時候,就自動增加,他想在特定的時候,為了恢複這個靜態變數的初值,動態卸了這個動態庫,然後重新載入。(該動態庫不能改動)

c#裡面要用到動態庫,需要使用DllImport,但是這個是全域的東西,不能像動態load/unload assembly所使用的AppDomain的方法。

這樣就想到了API: LoadLibrary, GetProcAddress, 和FreeLibrary方法。
  [DllImport("kernel32",EntryPoint="LoadLibrary",SetLastError=true)]
  static extern IntPtr LoadLibrary(string lpLibName);

  [DllImport("kernel32",EntryPoint="GetProcAddress",SetLastError=true)]
  static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

  [DllImport("kernel32",EntryPoint="FreeLibrary",SetLastError=true)]
  static extern bool FreeLibrary(IntPtr hModule);

然後調用
   IntPtr hModule = IntPtr.Zero;
   IntPtr pfn = IntPtr.Zero;

   // Load the library and get a pointer to the function 
   hModule = LoadLibrary("ADll.dll"); 
   pfn = GetProcAddress(hModule, "GetValue"); 
然後就麻煩了,知道這個函數的入口地址,我怎麼調用這個函數呢,我一直不知道這個用c#怎麼解決,最後就寫了一段IL代碼。
.assembly extern mscorlib {}
.assembly Wrapper {}

.class public Wrapper
{
     .method public static int32 SomeMethod(native int pfn)
    {
        .maxstack 2
        .locals (int32 V_0)
        ldarg.0 // Push pfn onto the execution stack
        calli unmanaged stdcall int32()
        stloc.0
        ldloc.0
        ret
    }
}
把這個.il檔案編譯成dll
然後代碼接著寫
   // Make call to function pointer
   int i = Wrapper.SomeMethod(pfn);

   MessageBox.Show(this, i.ToString());
 
   FreeLibrary(hModule);
問題就解決了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.