ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.Net Core下DllImport使用方法及扩展

2021-09-05 12:00:59  阅读:373  来源: 互联网

标签:Core DllImport System dll using Net public


引言

​ 在有时候的开发过程中,我们会遇到需要调用系统的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. 环境变量目录

标签:Core,DllImport,System,dll,using,Net,public
来源: https://www.cnblogs.com/ykbb/p/15229019.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有