zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    HDU 2516 取石子游戏(FIB博弈)
    HDU 2147 kiki's game (简单博弈,找规律)
    HDU 1847 Good Luck in CET-4 Everybody!(找规律,或者简单SG函数)
    ***Linux chmod命令修改文件与文件夹权限命令代码
    CentOS下用yum命令安装jdk
    Nginx 虚拟主机 VirtualHost 配置
    Nginx的nginx.conf配置文件中文注释说明
    快速php日志,写内容到文件,把日志写到log文件
    php-fpm进程管理方式(static和dynamic)
    阿里云宝塔Linux服务器管理面版初始化地址不能登入(原创)
  • 原文地址:https://www.cnblogs.com/ykbb/p/15229019.html
Copyright © 2011-2022 走看看