其它语言如何调用c# DLL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了其它语言如何调用c# DLL相关的知识,希望对你有一定的参考价值。

C#里dll有托管和非托管两种

托管dll只能运行在.net上,
win32下只能使用非托管dll

请注意版本。

在你的环境变量Path中加入
C:\\Program Files\\Microsoft Visual Studio .NET 2003\\SDK\\v1.1\\Bin;
C:\\WINNT\\Microsoft.NET\\Framework\\v1.1.4322

随便建立一个ClassLibrary编译成DLL文件
切换到MS-DOS命令行下面,运行:
C:\\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg

上面的命令行是注册我们的.NET组件,并且产生了一个备用的注册表文件。对应Windows的注册COM文件命令:regsvr32 c:\\test.dll .
在.NET下面,注册.NET组件就需要上面的regasm命令了

然后在MS-DOS命令行下面,运行:
C:\\>tlbExp ClassLibrary1.dll /out:ClassLibrary1.tlb

上面的命令行表示将会产生一个.NET组件的类型库
有了TLB文件也就和正常的COM组件一样了,运行Delphi导入类型库文件TLB......
和正常的COM调用一摸一样
--------------------------------------------------------------------------------
procedure 接口函数(参数);stdcall; external \'文件.dll\';
参考技术A 用XML

C#调用C++导出类的一个实例

一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了。
https://blog.csdn.net/huiyouyongdeyu2011/article/details/6547931
一开始“冰yi年华”老哥问我如何调用的时候,我随口一答:这个比较简单……
后来他告诉我:你的实例是C#调用C++的导出函数,不是导出类……
我想当然的回答:通俗的说,类不就是多个函数嘛,我马上写一个Demo给你……
结果被他言中,我失败了,找不到这个EntryPoint
后来他告诉我:C++不像C#那样支持映射,需要另行处理,于是我就开始百度,找了N久才成功,正好贴出来,留来后用。

首先我让老哥写了一段C++代码,如下

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif

// 此类是从 testdll.dll 导出的
class TESTDLL_API Ctestdll {
public:
 Ctestdll(void);
 // TODO: 在此添加您的方法。

public:
 int Add(int a, int b) {return a+b;}
 int Sub(int a, int b) {return a-b;}
 int Mul(int a, int b) {return a*b;}
};

extern TESTDLL_API int ntestdll;

TESTDLL_API int fntestdll(void);

这里有一个class :Ctestdll,它有三个function:Add、Sub、Mul,通过使用uedit32查看到它对应的三个导出函数分别是
1、?Add@Ctestdll@@QAEHHH@Z
2、?Sub@Ctestdll@@QAEHHH@Z
3、?Mul@Ctestdll@@QAEHHH@Z

好了,现在开始做Demo了:

1、打开VS2008,建一个测试项目WindowsFormsApplication2;

2、将C++编译的testdll.dll放入bin/Debug(因为我用的是调试模式);

3、新建一个类库文件,内容如下

using System;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication2
{
    class Ctestdll
    {
        [DllImport("testdll.dll", EntryPoint = "?Add@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
        private static extern int Add(int a, int b);
        public int myAdd(int a, int b)
        {
            return Add(a, b);
        }
        [DllImport("testdll.dll", EntryPoint = "?Sub@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
        private static extern int Sub(int a, int b);
        public int mySub(int a, int b)
        {
            return Sub(a, b);
        }
        [DllImport("testdll.dll", EntryPoint = "?Mul@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
        private static extern int Mul(int a, int b);
        public int myMul(int a, int b)
        {
            return Mul(a, b);
        }
    }
}

4、建一个Form  拖放三个TextBox 和三个Button

5、双击Button,写入如下代码

        private void button1_Click(object sender, EventArgs e)
        {
            Ctestdll test = new Ctestdll();
            this.textBox3.Text = test.myAdd(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Ctestdll test = new Ctestdll();
            this.textBox3.Text = test.mySub(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            Ctestdll test = new Ctestdll();
            this.textBox3.Text = test.myMul(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();

        }

6、启动调试(或按F5),尝试三个按钮的功能;


 


 

7、调试成功。到此C#调用C++导出类的实例结束了,整个实例 关键是找到对应的每个导出函数。

实例代码:
点击下载(119.6 KB)

以上是关于其它语言如何调用c# DLL的主要内容,如果未能解决你的问题,请参考以下文章

C语言怎么使用动态链接库,如何创建?(高手进)

LabVIEW如何方便地调用DLL文件

C#语言基础——函数

c语言如何做成.dll的东西?然后用c#做界面调用这个c程序?

C#调用C++导出类的一个实例

C#项目中如何调用C#写的dll中的资源文件,如 xml文件