C# WPF上位机开发(动态库dll的开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

很多时候,我们并不希望所有的程序都放到一个exe里面。因为这样相当于把所有的风险都放在了一个文件里里面,既不利于程序的升级,也不利于程序的模块化切割和复用。回到c#,它和单纯的c/c++又不太一样,因为它的dll有两种形式,一种是c#生成的dll,另外一种就是非c#生成的dll。

1、c#生成的dll

如果是c#编写的dll,使用方法就比较简单了。在当前prj下面创建一个c#的工程,编写对应的代码,比如这样,

复制代码
// 假设DLL中的类是这样的
namespace YourDllNamespace
{
    public class YourClass
    {
        public static void MessageBoxFunction(string message)
        {
            System.Windows.MessageBox.Show(message);
        }
    }
}

这样编写好之后,经过编译,就可以生成对应的dll文件。回到之前的exe工程,此时如果需要使用这个dll文件,它需要做的只有两步。第一步,就是在"引用"中选择刚才生成的dll;第二步,就是使用using关键字把刚才的namespace和类添加到当前的项目中。

复制代码
using YourDllNamespace; // 引用DLL中的命名空间

namespace YourWpfAppNamespace
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ShowMessageBoxButton_Click(object sender, RoutedEventArgs e)
        {
            // 调用DLL中的MessageBox函数
            YourClass.MessageBoxFunction("Hello from DLL!");
        }
    }
}

如此一来,我们就可以完成c# dll的引用和处理了。

2、使用其他语言生成的dll

但是呢,在c#出现之前本身已经很多很好的代码库,它们很大一部分都是用c/c++编写的。那么这个时候,如果需要使用这些库的话,就需要使用dllimport的形式了。这里为了简单说明一下,我们使用了user32.dll里面的MessageBox函数做一个示范,

复制代码
using System;
using System.Runtime.InteropServices;
using System.Windows;

namespace WpfApp
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox(IntPtr.Zero, "Hello from user32.dll!", "MessageBox Example", 0);
        }
    }
}

通过阅读代码,我们发现和之前有一点不同的是,MessageBox在使用之前做了一个DllImport的声明和extern的标志。做到了这一点,就可以在Button_Click回调函数里面使用MessageBox函数了。

当然,在实际使用的时候可能还会稍微复杂点。比如c/c++里面的数据结构基本上都不能直接引用了,都要转成int、double、float、string这些基础形式。如果数据复杂一点,大约比较好的处理方法就是先把数据pack成json的形式,然后转给c/c++。等结果ok了,再转成json返回给c#,这也是可以接受的一种方式。

相关推荐
2601_9669496514 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin14 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
滕州市燕猫虎计算机科技工作室个体工商户14 小时前
Java锁
java·开发语言
多加点辣也没关系15 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob23315 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean210315 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客15 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
新时代牛马17 小时前
cyclictest 毛刺从哪来?从ftrace、latencytop、perf到IRQ/调度延迟定位
android·开发语言·python·kotlin
三84417 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
IvanCodes17 小时前
Python 基础语法(七):推导式与常见遍历写法
开发语言·python