.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. 环境变量目录

Original: https://www.cnblogs.com/ykbb/p/15229019.html
Author: 一块白板
Title: .Net Core下DllImport使用方法及扩展

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615273/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java-Reflection(JAVA反射)

    Java-Reflection(JAVA反射)是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够通过Java-Reflection来调用它的…

    Java 2023年5月29日
    048
  • SpringCloudAlibaba项目之Nacos-config配置中心

    SpringCloudAlibaba随笔目录 一、SpringCloudAlibaba项目之父工程搭建 二、 SpringCloudAlibaba项目之Nacos搭建及服务注册 三…

    Java 2023年6月5日
    091
  • 史上最强IDEA工具使用教程,你想要的全都有!

    课程导读 俗话说:工欲善其事必先利其器。想要快速写出好的代码,更是离不开一个好的工具。在这个快速发展的社会,一个好的工具,能帮我们在开发过程中节省大量的开发时间。本套课程给同学们带…

    Java 2023年6月9日
    093
  • Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:《朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑》,引起的关注还是挺多的。后来和极客时间的编辑一拍即合决定以这个为题写一个专栏…

    Java 2023年5月29日
    091
  • Stream 流的基本概念以及常见应用

    流的基本概念 流是一种指定的计算视图。流遵循”做什么而非怎么做”的原则,它比循环更易于阅读。可以让你以一种声明的方式处理数据。 例如代码:有一个变量名为 w…

    Java 2023年6月8日
    085
  • 数据结构的魔法,递归调用

    一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,叫做递归函数。——《数据结构》严蔚敏 两年前在学习C语言的时候,老师就有讲过关于递归调用的问题。当时编程思想较弱的我,在…

    Java 2023年6月9日
    079
  • ssl生成以及nginx https配置

    https://blog.csdn.net/weixin_35884835/article/details/52588157 Original: https://www.cnblo…

    Java 2023年5月30日
    075
  • 关于博客园个人令牌访问

    今天我上传图片时,发现通道关闭了,吓得我赶紧看了一下提示信息. Original: https://www.cnblogs.com/sxrhhh/p/16396460.htmlAu…

    Java 2023年6月9日
    084
  • Cobol代码通过工具自动生成java代码 展示版

    本例是通过工具将cobol代码自动生成java代码。生成后的java代码是按照java编程风格生成的,完全屏蔽了cobol的特性。 一个cobol代码生成了4个java代码,分别说…

    Java 2023年6月8日
    077
  • CSharp: Factory Method Pattern in donet core 3

    调用: 输出: Original: https://www.cnblogs.com/geovindu/p/16753568.htmlAuthor: ®Geovin Du Dream…

    Java 2023年6月16日
    099
  • 分布式锁及其实现

    对于Java中的锁大家肯定都很熟悉,在Java中synchronized关键字和ReentrantLock可重入锁在我们的代码中是经常见的,一般我们用其在多线程环境中控制对资源的并…

    Java 2023年6月8日
    0100
  • 猴子吃桃(递归)

    递归案例实践分析 猴子偷桃 题目描述: 猴子第一天摘下若干桃子,当即吃了一半,觉得好吃不过瘾,于是又多吃了一个,,第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个…

    Java 2023年6月6日
    0139
  • Set集合

    一、Set集合简介 Set集合简单来说相当于一个桶,程序可以依次的把多个对象丢进桶中(Set集合) Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,…

    Java 2023年6月9日
    084
  • 软件工程 结构化设计方法 第3篇随笔

    * 调用:模块间的一种关系,模块A为了完成其任务必须依赖其他模块 ​ ——————> Original: https://www.cnblogs.com/shuisanya/…

    Java 2023年6月16日
    0100
  • Error:(8,46) java: 程序包com.xxx.local不存在

    项目在进行maven编译的时候出现 “Error:(8,46) java: 程序包com.xxx.local不存在” 问题,但是从idea中看又存在,没有问…

    Java 2023年5月29日
    089
  • java jfreechart 时序图横坐标显示,设置步数初始坐标不展示问题解决

    1,选择框架 org.jfree jfreechart 1.5.2 2,问题 我们时间绘制走势图的时候,框架会自动计算间隔,并在横坐标显示出计算之后的日期 但是往往自动计算出来展示…

    Java 2023年5月29日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球