非托管Dll动态调用

416 篇文章 5 订阅
348 篇文章 0 订阅
void sayHello(void)
{
printf("SayHello word!\n");

}

; sayHello.def : Declares the module parameters for the DLL.


LIBRARY      "sayHello"
DESCRIPTION  'sayHello Windows Dynamic Link Library'


EXPORTS
    ; Explicit exports can go here
sayHello


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

namespace CallUnManDll
{
    class Program
    {
        delegate bool doDllFunction();//如果需要执行的函数有参数,可对之进行声明。
        static void Main(string[] args)
        {//E:\learnProg\vc\sayHello\Release\sayHello.dll
            //void sayHello(void)
             
            DllInvoke dllInvoke = new DllInvoke(args[0]);//非托管dll文件路径
            doDllFunction show = (doDllFunction) dllInvoke.Invoke(args[1],typeof(doDllFunction));// InitFunction为需要执行的函数名
            bool ret=show();//执行方法,可根据定义决定是否需要传参数
        }
    }


    public class DllInvoke 
    {

        [DllImport("Kernel32.dll")]
        private static extern IntPtr LoadLibrary(string path); 

        [DllImport("Kernel32.dll")]
        private static extern IntPtr GetProcAddress(IntPtr lib,string FunName); 

        [DllImport("kernel32.dll")]
        public static extern bool FreeLibrary(IntPtr lib); 

        private IntPtr libr;
        public DllInvoke(string path)
        {
            libr = LoadLibrary(path);
        }

        public Delegate Invoke(string  funName, Type type)
        {
            IntPtr api = GetProcAddress(libr, funName);
            return (Delegate)Marshal.GetDelegateForFunctionPointer(api, type);
        }

        ~DllInvoke()
        {
            FreeLibrary(libr);//释放。必须的
        }

    }

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值