• C# 调用 Delphi Dll链接库方法及示例


    每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用Delphi DLL的方法进行介绍

    首先要搞清楚一点的是:什么是托管,什么是非托管?

    一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的

    C# 调用DLL中的非托管函数一般方法

    首先,应该在C#语言源程序中声明外部方法,其基本形式是:

    [DLLImport(“DLL文件”)]

    修饰符 extern 返回变量类型 方法名称 (参数列表)

    其中:

    DLL文件:包含定义外部方法的库文件。

    修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。

    返回变量类型:在DLL文件中你需调用方法的返回变量类型。

    方法名称:在DLL文件中你需调用方法的名称。

    参数列表:在DLL文件中你需调用方法的列表。

    注意:需要在程序声明中使用System.Runtime.InteropServices命名空间。

          DllImport只能放置在方法声明上。

    DLL文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path所设置的路径)。

    返回变量类型、方法名称、参数列表一定要与DLL文件中的定义相一致。

    下面结合示例如:

            [DllImport("TestDll.dll", EntryPoint = "SayHello")]      "TestDll.dll"为dll名称,EntryPoint 为函数名
            static extern string SayHello(string Name);              //delphi 中的函数
            private string GetMessage()                                  //C#自己写的函数,并调用Dll函数
            {
                return SayHello("");
            }

       当前程序中调用 GetMessage时就会返回Dll SayHello 函数的内容

      其中,Dll SayHello函数如下(Delphi语言):

     function SayHello(NameTool:PChar):PChar;stdcall;
      begin
        if Length(NameTool) <=0 then
          Result := PChar('Hello Person,welcome to chian.')
        else
          Result := PChar('Hello '+ NameTool + ', welcome to chian.');
      end;

    另外,如果需要调用传值,的方法时,通过Delphi的参数 var 与C#中的ref关键字结合使用如:

    procedure ChangeNumber(var number:Integer);stdcall;
      begin
        number := 100;
      end;

    C#调用如下:

    private int MyNumber = 150;

    [DllImport("TestDll.dll", EntryPoint = "ChangeNumber")]
     static extern void ChangeNumber(ref int count);
     private void Changes()
     {
         ChangeNumber(ref MyNumber);
     }

    当C#程序中调用  Changes方法后,MyNumber的值将会改变为100

    以上为C#简单调用Delphi Dll的方法。其中要注意的有:

    DLL文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path所设置的路径)。

    返回变量类型、方法名称、参数列表一定要与DLL文件中的定义相一致。


    人生的无奈那么多谁可以数得清?请告诉我!别回头走自己的路,就算有些事让人无助,至少我有一路吃苦的幸福!多年以后当我抬头望天空,湛蓝的色彩中依然有我沉郁多年的思绪!回归那一季那个曾叫‘山子’的男孩纯洁的微笑,然后宿命收拢指间,我们无处可逃
    作者:Love Coding
    出处:http://www.cnblogs.com/youshan/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    ZooKeeper-3.3.4集群安装配置
    zookeeper原理(转)
    flume 转
    Flume NG 简介及配置实战
    Flume NG 配置详解
    '增量赋值(augmented assignment)', 多么痛的领悟!
    用matplotlib制作的比较满意的蜡烛图
    Spyder code editor里的小秘密: 右侧高亮提示
    pywinauto: 导入时遇到 "TypeError: LoadLibrary() argument 1 must be string, not unicode"
    爬取新浪财经个股的历史财报摘要
  • 原文地址:https://www.cnblogs.com/youshan/p/2426529.html
Copyright © 2020-2023  润新知