C#写的dll跨语言调用

C#写的dll为非标准的windows下dll,故
一般其他语言不能直接调用,当然基于.net平台下的编程语言是可以调用,要让其他语言调用C#写的dll一般通过webservice服务或者是Com
方式。经过在网上找资料以及自身的实践发现可以通过以下方式在Delphi和VB语言中调用。

1.编写C#写dll,用VS新建一个类库项目TestDll,源码如下:

using System;

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

namespace
TestDll
{
   
/*
    1。所要导出的类必须为公有;
   
2。所有属性、方法也必须为公有;
   
3。要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;

    4。所有的事件也必须用接口方式;
    */

    public interface ITestClass
    {

        int Get(int a);

        string GetString();

    }
   
[ClassInterface(ClassInterfaceType.None)]
    public class
TestClass:ITestClass
    {

        public int Get(int a)

        {

            return
++a;
        }

public string GetString()
        {

            return
"test";
        }
   
}
}

设置项目属性,选中项目-属性-应用程序-程序集信息,勾选"使程序集Com可见";属性-生成,勾选为com互操作注册。设置后重新生成项目,即会向系统注册此dll,Debug目录下会生成TestDll.dll和TestDll.tlb两个文件。

2.用Delphi新建一个应用程序,保存应用程序,
然后选择"Project"-"Import type
library",在弹出的对话框中选择上步生成的TestDll.tlb,并进行类名和输出目录等设置,点击“Create
unit”,即会创建一个Delphi的tlb文件,在应用程序窗体界面放置2个按钮。一个按钮采用引入tlb文件方式调用,引入生成的tlb文件,一个
按钮采用ole方式调用。

源码如下。

unit
Unit1;

interface

uses
 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls,ComObj;

type
 
TForm1 = class(TForm)
    btn1: TButton;
   
btn2: TButton;
    procedure btn1Click(Sender: TObject);

    procedure btn2Click(Sender: TObject);
  private

    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1:
TForm1;

implementation

{$R
*.dfm}

uses
TestDll_TLB;

procedure
TForm1.btn1Click(Sender: TObject);
var
  aClass:TTestClass;

begin
  aClass:=TTestClass.Create(nil);
 
ShowMessage(IntToStr(aClass.Get(5)));
 
ShowMessage(aClass.GetString);
end;

procedure
TForm1.btn2Click(Sender: TObject);
var
  t:Variant;
begin

  t:=CreateOleObject(‘TestDll.TestClass‘);
 
ShowMessage(IntToStr(t.Get(5)));
  ShowMessage(t.GetString);

end;

end.

编译运行,即可看到效果。采用tlb方式调用可以看到dll提供的方法,但操作步骤繁琐,而采用ole方式不能看到接口的定义但调用简单。

          

3.在VB中调用该dll,用VB新建一个Exe程序,然后点击“工具”-“引用”,定位到TestDll.tlb文件,在窗体上放置一按钮,按钮事件源码如下:

Private Sub
CommandButton1_Click()
Dim o
Set o = CreateObject("TestDll.TestClass")

MsgBox o.Get(5)
MsgBox o.GetString
End Sub

编译运行即可看到效果。

   

转自:http://blog.csdn.net/zhenghui1/article/details/8070152

C#写的dll跨语言调用,布布扣,bubuko.com

时间: 2024-10-13 21:31:01

C#写的dll跨语言调用的相关文章

Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.Golang.Java.Python.PHP之间通过Thrift实现跨语言调用 1) Golang 客户端和服务端的实现及交互 2) python 客户端的实现与golang 服务端的交互 3) php 客户端的实现与golang 服务端的交互 4) java

(转)使用Thrift0.9.1实现跨语言调用Golang、Php、Python、Java

问题导读:什么是Thrift?Thrift的官方网站在哪里?Golang.Java.Python.PHP之间如何通过Thrift实现跨语言调用? 一.什么是Thrift Thrift是一种可伸缩的跨语言服务的发展软件框架.它结合了功能强大的软件堆栈的代码生成引擎,以建设服务. Thrift是facebook开发的,07年4月开放源代码,08年5月进入apache孵化器.创造Thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性.所以thr

C++ 跨语言调用 Java

C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由于 JNI 包含了丰富的接口映射和跨语言的数据通信,非常复杂(坑 深不见底),所以这里只对一个测试程序进行简单的描述. 最开始测试的时候选择了 Window7 64 的环境,安装的 Java JDK 也是64位的,但是我们都知道 VS 编译的程序默认情况下都是32位程序,所以我在 LoadLibra

CLS(公共语言规范)的CLSCompliant(跨语言调用)

.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace CLSsample{ public class CLSTest {  public CLSTest()  {     }  public void ABC()  {   Console.WriteLine("ABC");  } }} 在VB.net中调用:Dim c As CLSsampl

Java跨语言调用,使用JNA访问Java外部接口

1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可.首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下. 可 见步骤非常的多,很麻烦,使用JNI调用.dll/.so共享库都能体会到这个痛苦的过程.如果已有一个编译好的.dll/.so文件,如果使用JNI技 术调用,我们首先需要使用C语言另外写一个.dll/.so共享库,使用S

IDispatch接口 - 跨语言调用

当一个COM接口支持IDispatch的时候(Dual接口),它就可以被其他语言调用. 这里我用perl试了一下. perl测试代码 use warnings; use strict; use Win32::OLE; use constant ADS_UF_ACCOUNTDISABLE => 2; use constant ADS_SCOPE_SUBTREE => 2; my $MyCom = Win32::OLE->new( "MyCom.MyCar" ) or d

Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码,保存为m文件1 1.3. 通过cli接口调用Matlab执行m文件1 1.4. 效果如图1 1.1. 边缘检测的基本方法Canny最常用了 1.2. 编写matlab边缘检测代码,保存为m文件 fprintf('Hello World'); imag = imread('C:\00edge\a.jpg');  %读取 imag = rgb2gray(imag);        %转化为灰度图 %imag_f

实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace WcfService1 { [ServiceContract] public interface IAddService { [OperationContract] [WebInvoke(Method="GET",RequestFormat=WebMessageFormat.Json, Resp

易语言调用C++写的DLL

直接调用会弹出堆栈错误的信息,原因是VS默认是__cdcel方式,而易语言是__stdcall,所以调用约定不一致导致堆栈错误. 解决方案很简单,易语言声明DLL函数时"在库中对应命令名"函数名前加一个"@"符号即可. 简单测试一下: 头文件: 1 #pragma once 2 #include <Windows.h> 3 4 5 extern "C" __declspec(dllexport) int add1(int a, int