1. 程式人生 > 其它 >.Net Core下DllImport使用方法及擴充套件

.Net Core下DllImport使用方法及擴充套件

引言

​ 在有時候的開發過程中,我們會遇到需要呼叫系統的API,不巧的是.Net Core可能沒辦法為我們提供相關的呼叫方式。那需要如何才能解決這個問題呢?

​ 這時候我們就可能會考慮借鑑現成的別人寫好的程式碼或者自己編寫相關程式碼。

​ 由於.Net Core沒辦法提供相關呼叫那就可能考慮使用其他的方式來實現目的,比如說使用DllImport進行擴充套件。

什麼是DllImport

DllImport是System.Runtime.InteropServices名稱空間下的一個屬性類,其功能是提供從非託管DLL(託管/非託管是微軟的.net framework中特有的概念,其中,非託管程式碼也叫本地(native)程式碼。與Java中的機制類似,也是先將原始碼編譯成中間程式碼(MSIL,Microsoft Intermediate Language),然後再由.net中的CLR將中間程式碼編譯成機器程式碼。)匯出的函式的必要呼叫資訊。

DllImport屬性應用於方法,要求最少要提供包含入口點的dll的名稱。

.NetCore如何使用(.Net 系基本都可以參考此方法)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Reflection;
// DllImport所在名稱空間
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;

namespace HelloWord
{
    public class TestController : Controller
    {
        // dll檔名稱及待呼叫方法
        [DllImport("helloword.dll")]
        public static extern string hello();

        [HttpGet]
        public IActionResult Index()
        {
            return new ContentResult()
            {
                Content = hello()
            };
        }
    }
}

擴充套件

.Net Core是一跨平臺的,絕大多數會執行與Windows或者Linux上(OSX未實踐),那如何讓程式碼一次書寫能在兩個平臺都進行相容呢?在不考慮DllImport匯入的動態庫的相容性問題的前提下。可以採用不標明後綴的方式進行宣告。

// Windows下的動態連結庫為 helloword.dll 
// Linux下的動態連結庫為 hellowrd.so

// 這樣的寫法只能相容其中一種
[DllImport("helloword.dll")]
public static extern string hello();

// 通過這種寫法可以相容這兩種
[DllImport("helloword")]
public static extern string hello();

DllImport尋找順序

  1. 絕對路徑
  2. exe所在目錄
  3. System32目錄
  4. 環境變數目錄

本文來自部落格園,作者:一塊白板,轉載請註明原文連結:https://www.cnblogs.com/ykbb/p/15229019.html