最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#調(diào)用C動(dòng)態(tài)鏈接庫(kù)的實(shí)現(xiàn)

 更新時(shí)間:2024年01月21日 15:26:54   作者:zhuliang27  
動(dòng)態(tài)鏈接庫(kù)是不能直接執(zhí)行的,也不能接收消息,它只是一個(gè)獨(dú)立的文件,本文主要介紹了C#調(diào)用C動(dòng)態(tài)鏈接庫(kù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

前言

已經(jīng)沒(méi)寫過(guò)博客好久了,上一篇還是1年半前寫的LTE Gold序列學(xué)習(xí)筆記,因?yàn)楣ぷ魇亲鐾ㄐ艆f(xié)議的,然后因?yàn)榇髮W(xué)時(shí)沒(méi)好好學(xué)習(xí)專業(yè)課,現(xiàn)在理論還不扎實(shí),不敢瞎寫;

因?yàn)楣ぷ髟?,?jīng)常需要分析一些字節(jié)流數(shù)據(jù),所以基本都是用C寫的,結(jié)果輸出在命令行,或者txt/csv文件;但個(gè)人還是喜歡輸出到GUI界面,可選的手段就MFC、WinForm、PyQt:

MFC的話感覺(jué)多少有點(diǎn)過(guò)時(shí)了,所以用WinForm,PyQt的多點(diǎn),尤其是WinForm很方便;前段時(shí)間用WinForm寫了個(gè)日志分析工具,因?yàn)楸救耸菢I(yè)余的C#使用者,所以寫的很痛苦,至于數(shù)據(jù)處理的核心思想就CSDN上的結(jié)構(gòu)體字節(jié)流的相互處理,數(shù)據(jù)處理部分大概1000來(lái)行;但工作中用的結(jié)構(gòu)體通常很大,涉及大小端轉(zhuǎn)換,同時(shí)還有位域,處理起來(lái)很麻煩,用C的話就很方便,所以用C處理數(shù)據(jù)用WinForm、PyQt顯示的方法比較方便;所以就想著用C處理玩數(shù)據(jù)保存到txt/csv文件,然后用C#/Python去調(diào)用C應(yīng)用并讀取文件,但感覺(jué)有點(diǎn)low;所以就打算把C部分的處理輸出成dll文件,然后用C#/Python去調(diào)用DLL;當(dāng)然對(duì)我的需求來(lái)說(shuō),把所有數(shù)據(jù)封裝到1個(gè)結(jié)構(gòu)體里面,每個(gè)結(jié)構(gòu)體字段是Uint或者Uint數(shù)組即可;以下部分實(shí)現(xiàn)就僅僅是能用即可,沒(méi)具體設(shè)置;

C語(yǔ)言部分-編譯生成動(dòng)態(tài)鏈接庫(kù)

我辦公電腦上是VS2015,自己電腦是VS2017,創(chuàng)建工程有點(diǎn)差異;

VS2015工程設(shè)置使用CSDN上面的截圖,注意源文件后綴用默認(rèn)的cpp,不要用c,我還沒(méi)去學(xué)習(xí)這塊的細(xì)節(jié),反正能用就行

e3f1ed83fb834fde8ee35059faf95a7e.png

VS2017生成控制臺(tái)應(yīng)用程序后,需要將如下紅框中的配置類型修改為動(dòng)態(tài)庫(kù);

e9e57bfe1ad04f1393eac89c494253f0.png

然后代碼和C應(yīng)用程序的差異的話就在函數(shù)聲明或定義前加上

extern "C" _declspec(dllexport) int add_test(int x, int y);

不設(shè)置配置和平臺(tái)的話,默認(rèn)輸出就在Debug路徑下生成和項(xiàng)目名一樣的DLL文件,如下圖:

969a592af5c049aabc4abafe8e198d45.png

C#部分-使用動(dòng)態(tài)鏈接庫(kù)

把編譯生成的DLL文件放到C#編譯輸出的路徑下,不配置的話就在如下路徑:

ea1bae29460546589e5df985681b9f3e.png

在C#中調(diào)用C的話,核心代碼就如下2行,

[DllImport("DLLTEST.dll",CallingConvention=CallingConvention.Cdecl)]
extern static int add_test(int x, int y);

還有需要注意的點(diǎn),需要包含如下引用,當(dāng)然寫了如上第一行就會(huì)提示讓包含了:

using System.Runtime.InteropServices;

感覺(jué)像是函數(shù)外部聲明,能用就行,暫時(shí)沒(méi)有去深究原理啥的,輸出如下:

0e51a0b0e0bd4f75af5d6b424f0c7bf7.png

因?yàn)樾枰幚淼臄?shù)據(jù)通常比較多,所以就定義一個(gè)結(jié)構(gòu)體,把需要傳輸?shù)臄?shù)據(jù)全放里面,然后用1個(gè)接口就讀過(guò)去了;

簡(jiǎn)單做個(gè)測(cè)試

  • C程序定義一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體里面僅包含一個(gè)字段,字段是一個(gè)Uint類型的數(shù)組:
typedef struct
{
	unsigned int data[32];
}RetData;
  • C程序輸出結(jié)構(gòu)體數(shù)據(jù)測(cè)試:
void get_array(RetData* ret)
{
	for (int idx = 0; idx < 32; idx++)
	{
		ret->data[idx] = idx * 10;
	}
}
  • C#程序也定義一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體包含一個(gè)字段,字段是Uint32類型的數(shù)組:
    struct GetData
    {
        [MarshalAs(UnmanagedType.ByValArray,SizeConst =32)]
        public UInt32[] data;
    }
  • C#程序讀入結(jié)構(gòu)體數(shù)據(jù)測(cè)試,可能用法很不專業(yè),能讀出來(lái)就行

/* 函數(shù)外部聲明 */
[DllImport("DLLTEST.dll", CallingConvention = CallingConvention.Cdecl)]
extern static void get_array(ref GetData ret);

/* 在Main函數(shù)中調(diào)用 */
GetData getData = new GetData();
get_array(ref getData);
  • 輸出

f9732d18d81f40b8a7af00e1fa44496d.png

今天下午在公司寫了個(gè)維測(cè)工具,整個(gè)流程和上面測(cè)試步驟一致,能正常使用

Python部分-使用動(dòng)態(tài)鏈接庫(kù)

把編譯生成的DLL文件放到Python文件同級(jí)路徑下,這樣在Python代碼中就直接使用DLL文件名即可,Python測(cè)試代碼如下,調(diào)用數(shù)組那塊先前在公司測(cè)試正常能用來(lái)自,忘了,懶得寫了

import ctypes
dll = ctypes.windll.LoadLibrary('DLLTEST.dll')
print(dll.add_test(4, 5))

輸出5:如下圖:

0b803cd97e2a4c9ea73a8bd59f0e85b6.png

本來(lái)打算把整個(gè)工程打包放到CSDN來(lái)著,但免費(fèi)的話審核不通過(guò),所以就把C/C#部分代碼都貼下面了:

C程序頭文件

#pragma once
#ifndef DLL_TEST_H
#define DLL_TEST_H

typedef struct
{
	unsigned int data[32];
}RetData;

extern "C" _declspec(dllexport) int add_test(int x, int y);
extern "C" _declspec(dllexport) void get_array(RetData* ret);

#endif // !DLL_TEST_H

C程序源文件

#include <stdio.h>
#include <stdlib.h>
#include "dll_test.h"

int add_test(int x, int y)
{
	return x + y;
}

void get_array(RetData* ret)
{
	for (int idx = 0; idx < 32; idx++)
	{
		ret->data[idx] = idx * 10;
	}
}

C#程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{

    struct GetData
    {
        [MarshalAs(UnmanagedType.ByValArray,SizeConst =32)]
        public UInt32[] data;
    }

    class Program
    {
        [DllImport("DLLTEST.dll",CallingConvention=CallingConvention.Cdecl)]
        extern static int add_test(int x, int y);

        [DllImport("DLLTEST.dll", CallingConvention = CallingConvention.Cdecl)]
        extern static void get_array(ref GetData ret);

        static void Main(string[] args)
        {
            Console.WriteLine("{0} + {1} = {2}", 4, 5, add_test(4, 5));
            GetData getData = new GetData();
            get_array(ref getData);
            Console.ReadLine();
        }
    }
}

到此這篇關(guān)于C#調(diào)用C動(dòng)態(tài)鏈接庫(kù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C#調(diào)用C動(dòng)態(tài)鏈接庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法

    C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法,基于自定義類實(shí)現(xiàn)文本轉(zhuǎn)換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 基于C#實(shí)現(xiàn)Windows服務(wù)的方法詳解

    基于C#實(shí)現(xiàn)Windows服務(wù)的方法詳解

    在實(shí)際應(yīng)用過(guò)程中,有時(shí)候我們希望開發(fā)的程序,不需要界面,直接開機(jī)就可以長(zhǎng)時(shí)間運(yùn)行,這時(shí)候,我們可以考慮做成一個(gè)Windows服務(wù)。這篇文章跟大家介紹一下,如何基于C#實(shí)現(xiàn)Windows服務(wù)的創(chuàng)建、安裝、啟動(dòng)、停止和卸載,需要的可以參考一下
    2022-09-09
  • C#通過(guò)System.CommandLine快速生成支持命令行的應(yīng)用程序

    C#通過(guò)System.CommandLine快速生成支持命令行的應(yīng)用程序

    這篇文章介紹了C#通過(guò)System.CommandLine快速生成支持命令行應(yīng)用程序的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C# Newtonsoft.Json用法詳解

    C# Newtonsoft.Json用法詳解

    本文主要介紹了C# Newtonsoft.Json用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Entity?Framework配置關(guān)系

    Entity?Framework配置關(guān)系

    這篇文章介紹了Entity?Framework配置關(guān)系的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • c# 判斷指定文件是否存在的簡(jiǎn)單實(shí)現(xiàn)

    c# 判斷指定文件是否存在的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了c# 判斷指定文件是否存在的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下
    2014-02-02
  • WPF調(diào)用WindowsAPI實(shí)現(xiàn)屏幕錄制

    WPF調(diào)用WindowsAPI實(shí)現(xiàn)屏幕錄制

    這篇文章主要為大家詳細(xì)介紹了WPF如何調(diào)用WindowsAPI實(shí)現(xiàn)屏幕錄制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-05-05
  • HTML文本框的值改變后觸發(fā)后臺(tái)代碼的方法

    HTML文本框的值改變后觸發(fā)后臺(tái)代碼的方法

    asp.net用日期插件,當(dāng)選中一個(gè)日期時(shí)觸發(fā)一個(gè)事件,以查詢當(dāng)前日期的數(shù)據(jù)。這是要跟數(shù)據(jù)庫(kù)交互的。先貼出控件代碼:
    2013-04-04
  • WPF+ASP.NET SignalR實(shí)現(xiàn)后臺(tái)通知功能的示例代碼

    WPF+ASP.NET SignalR實(shí)現(xiàn)后臺(tái)通知功能的示例代碼

    本文以一個(gè)簡(jiǎn)單示例,簡(jiǎn)述如何通過(guò)WPF+ASP.NET SignalR實(shí)現(xiàn)消息后臺(tái)通知以及數(shù)據(jù)的實(shí)時(shí)刷新,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正
    2022-09-09
  • C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo)

    C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo)

    這篇文章主要介紹了C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論

封开县| 黑山县| 景谷| 叙永县| 渭源县| 赣州市| 肥乡县| 石狮市| 卓尼县| 太仓市| 吉水县| 白朗县| 浏阳市| 当阳市| 灵宝市| 仙居县| 平遥县| 满洲里市| 静乐县| 鹿泉市| 伽师县| 荔波县| 灵山县| 仙桃市| 闵行区| 临武县| 江安县| 集贤县| 延安市| 彭山县| 江达县| 灵寿县| 通许县| 长治县| 准格尔旗| 青河县| 绥中县| 安西县| 徐水县| 禹州市| 县级市|