每种编程语言调用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文件中的定义相一致。

转载于:https://www.cnblogs.com/youshan/archive/2012/03/31/2426529.html

C# 调用 Delphi Dll链接库方法及示例相关推荐

  1. qt采用C++/CLI 方式调用C#dll的封装方法

    在qt中调用C++dll一般都可以直接使用,但是在调用C#版dll时,就有些麻烦了.本文采用C++/cli封装C#的dll的方式.实现了qt调用C#dll的方法. .h文件 #pragma once ...

  2. rust 使用 ffi 调用 C 静态链接库

    创建build.rs //build.rs extern crate dunce; use std::{env, path::PathBuf}; fn main() { let library_nam ...

  3. C#调用C++DLL类的方法

    C++的优势在于高效灵活,C#的优势在于简单易用,两者结合起来对项目开发来说是件好事,而且C++不容易反编译,也保障了代码的安全性,如果一些核心算法使用C#编写,那么保密就是一个问题.     C++ ...

  4. [轉]c#简单调用DELPHI DLL封装窗体

    http://www.cnblogs.com/el-net/archive/2008/10/13/1309940.html dllimport Delphi dll dllimport dll Del ...

  5. C++中.lib静态库、.dll动态库的生成及调用1

    一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...

  6. C#调用Delphi开发的DLL报内存写保护的错误信息

    相信很多使用c#的朋友碰到过类似的问题,我今天在开发中也碰到类似问题,希望能给大家一点启示吧! 在delphi中申明的函数原型为 function aa(var writedate:pchar;var ...

  7. vc6.0静态链接库的创建与使用方法

    1.建立如下的工程 选择该界面的最后一个,即创建了一个静态链接库,注意填写工程的名称. 2.在该工程下创建lib.h和lib.cpp两个文件 lib.h中源代码如下: #ifndef LIB_H #d ...

  8. C++静态链接库(lib)的创建及调用

    C++静态链接库(lib)的创建及调用 1. 静态链接库的创建 2. 静态链接库的调用 1. 静态链接库的创建 首先在新建项目中,选择Visual C++,Win32控制台应用程序.这里我将新建的文件 ...

  9. C#时常需要调用C++DLL

    在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家: VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, st ...

最新文章

  1. 网络营销越来越“内卷”,SEO优化时需注意什么细节?
  2. Data Guard相关参数学习介绍
  3. 用numpy autograd 实现牛顿迭代
  4. [BTS] Could not find stored procedure 'mp_sap_check_tid'
  5. (1)段寄存器属性探测
  6. wopi php,Office Online Server WOPI 接口
  7. java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)
  8. java 挥发注解_Java的挥发性修饰符
  9. BZOJ 1192 [HNOI2006]鬼谷子的钱袋 (思维)
  10. Shell date连接mysql执行指令
  11. RuntimeError: The size of tensor a (4) must match the size of tensor b (3)
  12. 年度盘点:2018云栖社区15大影响力技术团队(附100+干货博文)
  13. R语言简单应用掷骰子游戏
  14. 动态规划-多边形游戏算法
  15. 7、树莓派音频——jackd进阶篇
  16. Android Studio 开发(二)问题
  17. 【WIP】Seastar框架学习
  18. IP地址,子网掩码,网段 概念详解
  19. 易语言和python混合编程_关于易语言与Python的一点想法
  20. Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)

热门文章

  1. eclipse解决Android Library Project jar包重复导致的问题
  2. Java多线程复习_Java多线程复习
  3. 龙芯派启用串口3-5
  4. php中改变函数路由,php – 如何修改codeigniter中的路由
  5. sql实现like多个值的查询
  6. php excel导入mysql_PHP将Excel内容导入mysql数据库
  7. mysql 查询时间转换_数据库查询时日期的转换
  8. Spring系列(七):@FactoryBean注解用法介绍
  9. 分享适合程序员使用17 张壁纸
  10. 服务器优化:Tomcat、JVM性能调优笔记