日期:2014-05-18  浏览次数:20883 次

如何调用外部的DLL
在C#中怎样调用外部DLL

------解决方案--------------------
DLLImport,看帮助
------解决方案--------------------
在引用中添加DLL
------解决方案--------------------
http://blog.csdn.net/zhangzxy161723/article/details/4132853

C#语言使用方便,入门门槛较代,上手容易,并且语法与C,java有很类似的地方,IDE做的也好,通用性好,是MS下一代开发的主要力量.但是其开源代码较少,类库不是十分完美,在架构方面还有一些需要做的工作.C++写的程序占用内存较小,直接对内存或者文件操作,因此一些关键的步骤或者一些最内层的循环在一定程序上还需要依赖C++.

 

对于一直做c++开发的人员,使用c#来做界面将是一个很好的选择。

 

c#调用DLL用两种方式:直接导出函数;使用def文件导出函数。下面介绍一个不采用def导出文件的简单例子

第一步,用C++做一个可以导出函数的dll(不采用def文件)

cxyMath.h
//在这里定义导出哪一些函数

 

class MyMathFuncs
...{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);

// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);

// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);

// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
cxyMath.cpp的实现就很简单了,代码附在上传的文件中,在这里就不贴代码了,编译成dll后,拷贝dll,lib文件到C#的工程中的debug的目录下(如果你写的是release版,请将dll,lib拷贝到relase文件夹下)

第二步:找出导出的函数名
写成如下形式,方便CS的调用
不采用def文件导出的函数名有些奇怪,但还是可以看出函数的层次,?函数名@类名@命名空间@@******,
找函数名可以使用ultraedit32,打开lib文件,就可看到了
另外,我们可以使用dllexp这个程序找出导出的函数(这个程序见附录)

 

[DllImport("cppdll.dll",EntryPoint="?Divide@MyMathFuncs@MathFuncs@@SANNN@Z",CharSet = CharSet.Auto)]
public static extern double Divide(double a,double b);

[DllImport("cppdll.dll",EntryPoint="?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z",CharSet = CharSet.Auto)]
public static extern double Multiply(double a,double b);
 第三步,调用

private void button1_Click(object sender, System.EventArgs e)
...{
MessageBox.Show(Multiply(12,13).ToString());
}
采用def 文件导出函数

第一种方式比较简单,但是找一个dll函数的入口地址,还是比较麻烦的,并且,入口地址没有太大的意义,不直观,不好记忆

一般情况下,我们可以选择使用def文件导出函数

第一步,新建一个win32 application然后在应用程序的设置中选择动态dll,然后选择导出符号,这样,vs2003就为我们生成了一个非常完整的架子,但是美中不足的是生成的dll导出的函数也是和第一中情况一样

第二步,添加一个def文件,生成def文件的同时,vs2003自动为我们添加了这样一行,
LIBRARY win32dll

我们只要在他的下面加上我们要导出的函数就可以了.
GetAName @1
ShowMyName @2
PerfTest @3

这样经过编译我们使用dllexp查看,看到的就不再是一些没有意义的函数名了,而是我们在def中定义的文件函数名

第三步,拷贝lib,dll文件到CS工程中就可以了,
我们就不在这里一一叙述了

 


------解决方案--------------------
"在C#中怎样调用外部DLL",这个dll是net写的,还是C/C++写的,
如果是前者,直接引入到工程;如果是后者,给你一些使用实例:

平台调用P-INVOKE


------解决方案--------------------
在COM中引用一下,如果可用的话,会自动生成c#托管的DLL文件。你只需要发布这个文件就行了、
------解决方案--------------------
先将该DLL文件添加到Bin文件夹中,然后右击Bin文件夹,添加引用,在浏览中找到该DLL文件,确定即可
------解决方案--------------------
探讨

先将该DLL文件添加到Bin文件夹中,然后右击Bin文件夹,添加引用,在浏览中找到该DLL文件,确定即可

------解决方案--------------------
探讨
先将该DLL文件添加到Bin文件夹中,然后右击Bin文件夹,添加引用,在浏览中找到该DLL文件,确定即可

------解决方案--------------------
以前有碰到过一个led二次开发的,是直接放在bin中,没有添加引用。而是DllImport 属性用于指定包含外部方法的实现的dll 位置。 
[DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)]
public static extern int User_AddProgram(int CardNum, Boolean bWaitToEnd, int iPlayTime);