ASP.net/C#中如何调用动态链接库DLL

动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。 
动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。
DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
下面列出了当程序使用 DLL 时提供的一些优点:[1]
1)        使用较少的资源
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。 
2)        推广模块式体系结构
DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。 
3)        简化部署和安装
当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。 
每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。首先,您需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。 
(一)     调用DLL中的非托管函数一般方法
首先,应该在C#语言源程序中声明外部方法,其基本形式是:
[DLLImport(“DLL文件”)]
修饰符 extern 返回变量类型 方法名称 (参数列表)
其中:
DLL文件:包含定义外部方法的库文件。
修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。
返回变量类型:在DLL文件中你需调用方法的返回变量类型。
方法名称:在DLL文件中你需调用方法的名称。
参数列表:在DLL文件中你需调用方法的列表。
注意:需要在程序声明中使用System.Runtime.InteropServices命名空间。
      DllImport只能放置在方法声明上。
DLL文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path所设置的路径)。
返回变量类型、方法名称、参数列表一定要与DLL文件中的定义相一致。
若要使用其它函数名,可以使用EntryPoint属性设置,如:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);
其它可选的 DllImportAttribute 属性:阿
CharSet 指示用在入口点中的字符集,如:CharSet=CharSet.Ansi;
SetLastError 指示方法是否保留 Win32"上一错误",如:SetLastError=true;
ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配,如:ExactSpelling=false;
PreserveSig指示方法的签名应当被保留还是被转换, 如:PreserveSig=true;
CallingConvention指示入口点的调用约定, 如:CallingConvention=CallingConvention.Winapi;
此外,关于“数据封送处理”及“封送数字和逻辑标量”请参阅其它一些文章[2]。
C#例子:

1.       启动VS.NET,新建一个项目,项目名称为“Tzb”,模板为“Windows 应用程序”。
2.       在“工具箱”的“ Windows 窗体”项中双击“Button”项,向“Form1”窗体中添加一个按钮。
3.       改变按钮的属性:Name为 “B1”,Text为 “用DllImport调用DLL弹出提示框”,并将按钮B1调整到适当大小,移到适当位置。
4.       在类视图中双击“Form1”,打开“Form1.cs”代码视图,在“namespace Tzb”上面输入“using System.Runtime.InteropServices;”,以导入该命名空间。
5.       在“Form1.cs[设计]”视图中双击按钮B1,在“B1_Click”方法上面使用关键字 static 和 extern 声明方法“MsgBox”,将 DllImport 属性附加到该方法,这里我们要使用的是“user32.dll”中的“MessageBoxA”函数,具体代码如下:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);

然后在“B1_Click”方法体内添加如下代码,以调用方法“MsgBox”:
MsgBox(0," 这就是用 DllImport 调用 DLL 弹出的提示框哦! "," 挑战杯 ",0x30);
6.       按“F5”运行该程序,并点击按钮B1,便弹出如下提示框:

7.代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{

public partial class
Form1 : Form
    {
        [DllImport("user32.dll",
EntryPoint = "MessageBoxA")]
        static extern int MsgBox2(int hWnd,
string msg, string caption, int type);
        public Form1()
        {
           
InitializeComponent();
        }

private void Form1_Load(object sender, EventArgs e)
        {

}

private void button1_Click(object
sender, EventArgs e)
        {
            MsgBox2(0,
" 这就是用 DllImport 调用 DLL 弹出的提示框哦! ", " 挑战杯 ", 0x30);
        }

private void button2_Click(object sender, EventArgs e)
        {
            MsgBox2(0,
" 这就是用 DllImport 调用 DLL 弹出的提示框哦222222f! ", " 222222 ", 0x30);

}
    }
}

(二)     动态装载、调用DLL中的非托管函数
在上面已经说明了如何用DllImport调用DLL中的非托管函数,但是这个是全局的函数,假若DLL中的非托管函数有一个静态变量S,每次调用这个函数的时候,静态变量S就自动加1。结果,当需要重新计数时,就不能得出想要的结果。下面将用例子说明:
1.        DLL的创建
1)        启动Visual C++ 6.0;
2)        新建一个“Win32 Dynamic-Link Library”工程,工程名称为“Count”;
3)        在“Dll kind”选择界面中选择“A simple dll project”;
4)        打开Count.cpp,添加如下代码:
// 导出函数,使用“ _stdcall ” 标准调用
extern "C" _declspec(dllexport)int _stdcall count(int init);
int _stdcall count(int init)
{//count 函数,使用参数 init 初始化静态的整形变量 S ,并使 S 自加 1 后返回该值
static int S=init;
S++;
return S;
}

5)       
按“F7”进行编译,得到Count.dll(在工程目录下的Debug文件夹中)。
2.         用DllImport调用DLL中的count函数
1)        打开项目“Tzb”,向“Form1”窗体中添加一个按钮。
2)        改变按钮的属性:Name为 “B2”,Text为 “用DllImport调用DLL中count函数”,并将按钮B1调整到适当大小,移到适当位置。
3)        打开“Form1.cs”代码视图,使用关键字 static 和 extern 声明方法“count”,并使其具有来自 Count.dll 的导出函数count的实现,代码如下:

[DllImport("Count.dll")]
static extern int count(int init);

4)       
在“Form1.cs[设计]”视图中双击按钮B2,在“B2_Click”方法体内添加如下代码:
MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 0 ,得到的结果是: "+count(0).ToString()," 挑战杯 ");
MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 10 ,得到的结果是: "+count(10).ToString()+"n 结果可不是想要的 11 哦!!! "," 挑战杯 ");
MessageBox.Show(" 所得结果表明: n 用 DllImport 调用 DLL 中的非托管 n 函数是全局的、静态的函数!!! "," 挑战杯 ");
5)        把Count.dll复制到项目“Tzb”的binDebug文件夹中,按“F5”运行该程序,并点击按钮B2,便弹出如下三个提示框:

第1个提示框显示的是调用“count(0)”的结果,第2个提示框显示的是调用“count(10)”的结果,由所得结果可以证明“用DllImport调用DLL中的非托管函数是全局的、静态的函数”。所以,有时候并不能达到我们目的,因此我们需要使用下面所介绍的方法:C#动态调用DLL中的函数。
  
3.        C#动态调用DLL中的函数
因为C#中使用DllImport是不能像动态load/unload assembly那样,所以只能借助API函数了。在kernel32.dll中,与动态库调用有关的函数包括[3]:
①LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。
它们的原型分别是:
HMODULE LoadLibrary(LPCTSTR lpFileName);
FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);
BOOL FreeLibrary(HMODULE hModule);
现在,我们可以用IntPtr hModule=LoadLibrary(“Count.dll”);来获得Dll的句柄,用IntPtr
farProc=GetProcAddress(hModule,”[email protected]”);来获得函数的入口地址。
但是,知道函数的入口地址后,怎样调用这个函数呢?因为在C#中是没有函数指针的,没有像C++那样的函数指针调用方式来调用函数,所以我们得借助其它方法。经过研究,发现我们可以通过结合使用System.Reflection.Emit及System.Reflection.Assembly里的类和函数达到我们的目的。为了以后使用方便及实现代码的复用,我们可以编写一个类。
1)        dld类的编写:
1.       打开项目“Tzb”,打开类视图,右击“Tzb”,选择“添加”-->“类”,类名设置为“dld”,即dynamic loading dll 的每个单词的开头字母。
2.       添加所需的命名空间及声明参数传递方式枚举:
using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空间
using System.Reflection; // 使用 Assembly 类需用此 命名空间
using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空间

在“public class dld”上面添加如下代码声明参数传递方式枚举:
/// <summary>
/// 参数传递方式枚举 ,ByValue 表示值传递 ,ByRef 表示址传递
/// </summary>
public enum ModePass
{
ByValue = 0x0001,
ByRef = 0x0002
}
3.       声明LoadLibrary、GetProcAddress、FreeLibrary及私有变量hModule和farProc:
/// <summary>
/// 原型是 :HMODULE LoadLibrary(LPCTSTR lpFileName);
/// </summary>
/// <param name="lpFileName">DLL 文件名 </param>
/// <returns> 函数库模块的句柄 </returns>
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
/// <summary>
/// 原型是 : FARPROC GetProcAddress(HMODULE hModule, LPCWSTR
lpProcName);
/// </summary>
/// <param name="hModule"> 包含需调用函数的函数库模块的句柄 </param>
/// <param name="lpProcName"> 调用函数的名称 </param>
/// <returns> 函数指针 </returns>
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
/// <summary>
/// 原型是 : BOOL FreeLibrary(HMODULE hModule);
/// </summary>
/// <param name="hModule"> 需释放的函数库模块的句柄 </param>
/// <returns> 是否已释放指定的 Dll</returns>
[DllImport("kernel32",EntryPoint="FreeLibrary",SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);
/// <summary>
/// Loadlibrary 返回的函数库模块的句柄
/// </summary>
private IntPtr hModule=IntPtr.Zero;
/// <summary>
/// GetProcAddress 返回的函数指针
/// </summary>
private IntPtr farProc=IntPtr.Zero;
4.       添加LoadDll方法,并为了调用时方便,重载了这个方法:

/// <summary>
/// 装载 Dll
/// </summary>
/// <param name="lpFileName">DLL 文件名 </param>
public void LoadDll(string lpFileName)
{
hModule=LoadLibrary(lpFileName);
if(hModule==IntPtr.Zero)
throw(new Exception(" 没有找到 :"+lpFileName+"." ));
}
          若已有已装载Dll的句柄,可以使用LoadDll方法的第二个版本:
public void LoadDll(IntPtr HMODULE)
{
if(HMODULE==IntPtr.Zero)
throw(new Exception(" 所传入的函数库模块的句柄 HMODULE 为空 ." ));
hModule=HMODULE;
}
5.       添加LoadFun方法,并为了调用时方便,也重载了这个方法,方法的具体代码及注释如下:
/// <summary>
/// 获得函数指针
/// </summary>
/// <param name="lpProcName"> 调用函数的名称 </param>
public void LoadFun(string lpProcName)
{ // 若函数库模块的句柄为空,则抛出异常
if(hModule==IntPtr.Zero)
throw(new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));
// 取得函数指针
farProc = GetProcAddress(hModule,lpProcName);
// 若函数指针,则抛出异常
if(farProc==IntPtr.Zero)
throw(new Exception(" 没有找到 :"+lpProcName+" 这个函数的入口点 "));
}
/// <summary>
/// 获得函数指针
/// </summary>
/// <param name="lpFileName"> 包含需调用函数的 DLL 文件名 </param>
/// <param name="lpProcName"> 调用函数的名称 </param>
public void LoadFun(string lpFileName,string lpProcName)
{ // 取得函数库模块的句柄
hModule=LoadLibrary(lpFileName);
// 若函数库模块的句柄为空,则抛出异常
if(hModule==IntPtr.Zero)
throw(new Exception(" 没有找到 :"+lpFileName+"." ));
// 取得函数指针
farProc = GetProcAddress(hModule,lpProcName);
// 若函数指针,则抛出异常
if(farProc==IntPtr.Zero)
throw(new Exception(" 没有找到 :"+lpProcName+" 这个函数的入口点 "));
}
6.       添加UnLoadDll及Invoke方法,Invoke方法也进行了重载:
/// <summary>
/// 卸载 Dll
/// </summary>
public void UnLoadDll()
{
FreeLibrary(hModule);
hModule=IntPtr.Zero;
farProc=IntPtr.Zero;
}

asp.NET 如何生成DLL文件,并调用

发表日期:2009-12-3

新浪微博QQ空间QQ微博百度搜藏腾讯朋友QQ收藏百度空间人人网开心网


使用csc命令将.cs文件编译成.dll的过程

很多时候,我们需要将.cs文件单独编译成.dll文件, 操作如下:

打开命令窗口->输入cmd到控制台->cd
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322

转到vs.net安装的该目录下->执行csc命令csc
/target:library File.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322目录下)

csc命令的方式很多,请参考以下

译 File.cs 以产生
File.exe

csc File.cs 编译 File.cs 以产生
File.dll

csc /target:library File.cs 编译 File.cs 并创建
My.exe

csc /out:My.exe File.cs 通过使用优化和定义 DEBUG 符号,编译当前目录中所有的 C# 文件。输出为
File2.exe

csc /define:DEBUG /optimize /out:File2.exe *.cs 编译当前目录中所有的 C# 文件,以产生
File2.dll 的调试版本。不显示任何徽标和警告

csc /target:library /out:File2.dll /warn:0 /nologo /debug
*.cs 将当前目录中所有的 C# 文件编译为
Something.xyz(一个 DLL)

csc /target:library /out:Something.xyz *.cs 编译
File.cs 以产生
File.dll

csc /target:library File.cs这个就是我们使用最多的一个命令,其实可以简单的写成csc /t:library
File.cs,另外的一个写法是 csc
/out:mycodebehind.dll /t:library mycodebehind.cs,这个可以自己指定输出的文件名。

csc /out:mycodebehind.dll /t:library mycodebehind.cs mycodebehind2.cs,这个的作用是把两个cs文件装到一个.dll文件里

举例(摘于网络)

一、 动态链接库

什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic
Link Library 的缩写形式,动态链接库
(DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL
中,该 DLL
包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL
副本的内容。

  和大多数程序员一样,你一定很使用过DLL吧。也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库), 其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来达到很高的代码重用效果。下面我来介绍一下在C#中如何创建和调用DLL。

二、准备工作

  我们需要对我们接下来要做的事情做个简单的介绍,在本文我们将利用C#语言创建一个名为
MyDLL.DLL的动态链接库,在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值,另一个功能是求两个参数的最大公约数。然后创建一个应用程序使用这个DLL。运行并输出结果。

三、创建DLL

让我们创建以下三个C#代码文件:

1、
MySwap.cs

}

using System;

namespace MyMethods

{

public class SwapClass

{

public
static bool Swap(ref long i,ref long j)

{

i
= i+j;

j
= i-j;

i
= i-j;

return
true;

}

}

}

2、MyMaxCD.cs

using System;

namespace MyMethods

{

public class MaxCDClass

{

public
static long MaxCD(long i, long j)

{

long
a,b,temp;

if(i>j)

{

a
= i;

b
= j;

}

else

{

b
= i;

a
= j;

}

temp
= a % b;

while(temp!=0)

{

a
= b;

b
= temp;

temp
= a % b;

}

return
b;

}

}

}

 需要注意的是:我们在制作这两个文件的时候可以用Visual
Studio.NET或者其他的文本编辑器,就算是记事本也可以。这两个文件虽然不在同一个文件里面,但是他们是属于同一个namespace(名称空间)这对以后我们使用这两个方法提供了方便。当然他们也可以属于不同的名称空间,这是完全可以的,但只是在我们应用他们的时候就需要引用两个不同的名称空间,所以作者建议还是写在一个名称空间下面比较好。

  接下来的任务是把这两个cs文件变成我们需要的DLL文件。方法是这样的:在安装了Microsoft.NET
Framework的操作系统上,我们可以在Windows所在目录下找到Microsoft.NET目录。在这个目录下面提供了C#的编译器,CSC.EXE运行:csc
/target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs,完成后可在本目录下面找到我们刚才生成的MyDLL.DLL文件/target:library
编译器选项通知编译器输出 DLL
文件而不是 EXE
文件。后跟文件名的
/out 编译器选项用于指定 DLL
文件名。如果/out后面不跟文件名编译器使用第一个文件
(MySwap.cs) 作为 DLL
文件名。生成的文件为MySwap.DLL文件。

  OK!我们创建动态链接库文件的任务完成了,现在是我们享受劳动成果的时候了,下面我将介绍如何使用我们所创建的动态链接库文件。   四、使用DLL   我们简单写一个小程序来测试一下我们刚才写的两个方法是否正确,好吧,跟我来:

MyClient.cs

using System;

using MyMethods; //这里我们引用刚才定义的名称空间,如果刚才的两个文件我们写在两个不同的名称空间

class MyClient

{

public static void
Main(string[] args)

{

if
(args.Length != 2)

{

Console.WriteLine("Usage:
MyClient <num1> <num2>");

return;

}

long
num1 = long.Parse(args[0]);

long
num2 = long.Parse(args[1]);

SwapClass.Swap(ref
num1,ref num2);

   // 请注意,文件开头的
using 指令使您得以在编译时使用未限定的类名来引用 DLL
方法

Console.WriteLine("The
result of swap is num1 = {0} and num2 ={1}",num1, num2);

long
maxcd = MaxCDClass.MaxCD(num1,num2);

Console.WriteLine("The
MaxCD of {0} and {1} is {2}",num1, num2, maxcd);

}

}

若要生成可执行文件
MyClient.exe,请使用以下命令行:

csc /out:MyClient.exe /reference:MyDLL.DLL MyClient.cs

/out 编译器选项通知编译器输出 EXE
文件并且指定输出文件名
(MyClient.exe)。/reference
编译器选项指定该程序所引用的 DLL
文件。

五、执行

若要运行程序,请输入 EXE
文件的名称,文件名的后面跟两个数字,例如:MyClient
123 456

六、输出

The result of swap is num1 = 456 and num2 = 123

The MaxCD of 456 and 123 is 3

七、小结

动态链接具有下列优点:

  1、节省内存和减少交换操作。很多进程可以同时使用一个 DLL,在内存中共享该 DLL
的一个副本。相反,对于每个用静态链接库生成的应用程序,Windows
必须在内存中加载库代码的一个副本。

  2、节省磁盘空间。许多应用程序可在磁盘上共享 DLL
的一个副本。相反,每个用静态链接库生成的应用程序均具有作为单独的副本链接到其可执行图像中的库代码。     3、升级到 DLL
更为容易。DLL 中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。

  4、提供售后支持。例如,可修改显示器驱动程序 DLL
以支持当初交付应用程序时不可用的显示器。

  5、支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的 DLL
函数。程序与 DLL
函数在下列方面必须是兼容的:函数期望其参数被推送到堆栈上的顺序,是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。

  6、提供了扩展 MFC
库类的机制。可以从现有 MFC
类派生类,并将它们放到 MFC
扩展 DLL
中供 MFC
应用程序使用。

  7、使国际版本的创建轻松完成。通过将资源放到 DLL
中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL
资源文件中,并使不同的语言版本加载合适的资源。

  使用 DLL
的一个潜在缺点是应用程序不是独立的;它取决于是否存在单独的 DLL
模块。

时间: 2024-10-22 01:52:29

ASP.net/C#中如何调用动态链接库DLL的相关文章

VC与Matlab混合编程之调用动态链接库dll(C++)——&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序

# 中静态调用C++dll 和C# 中动态调用C++dll

C# 中静态调用C++dll 和C# 中动态调用C++dll 在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能反编译.这样一来,就涉及C#托管代码与C++非托管代码互相调用,于是调查了一些资料,顺便与大家分享一下: 一. C# 中静态调用C++动态链接 1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dl

C# 中静态调用C++dll 和C# 中动态调用C++dll

C# 中静态调用C++dll 和C# 中动态调用C++dll 在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能反编译.这样一来,就涉及C#托管代码与C++非托管代码互相调用,于是调查了一些资料,顺便与大家分享一下: 一. C# 中静态调用C++动态链接 1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dl

JNI java调用动态链接库dll

现在做的项目中就用到了JNI调用c语言实现的访问设备的dll文件,在此之前对JNI是一窍不通哈,只听说过JNA链接dll,但只是一个了解. JNI(Java Native Interface)Java本地接口,主要作用是实现java代码与C C++编写的代码交互. 理论不多说,还是看java链接dll具体操作吧..如下: 以下实例为java中调用connection.dll文件中的 open()方法. 1,java方 1)装载dll文件 有两种方式System.load();和System.lo

JAVA调用动态链接库(dll)

    菜鸡爬坑 基础知识  因为某个东西的keygen我只会在win下生成!! 所以只能出此下策!!之前一直是android下用jni调用so文件,现在试下java在win平台下调用dll 首先还是老套路,直接在dll中弹出一个信息框具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内弹出信息框.首先在java中定义一个类 代码: package cn.ylca.dll; public class DllEntity { //本地方法          public nat

制作和unity调用动态链接库dll文件640mtzdx

ケ嘣ォ咎 柁拼咫荦 着惯性向前小走了七八步距离驼队不过十步之隔.商队所有人都目瞪口呆还有人下意识 Ν熄底娜 况城主拣选出来的那部秘笈本就不苛求先天根骨好坏只讲究一个日积月累." 勤扃信啵 喧土怜短 揖幻臀舔 整荸磉 恽箭娶拢 褓瞪摇 嬉镘 剽杜 靥闼昏 测寇江淮的下一步动作不过老臣想啊只要能打掉梳妆郡三地任意其中一个赵毅的那员 添置了好些物件当时事后还心疼来着偷偷埋怨自己不该大手大脚结果如今都涨了价格 件沃楼 薅窨市叫 ㄗ尤绡 晨起雾霭一行人由虎头城南门骑马而出然后分道扬镳.

JAVA调用动态链接库DLL之JNative学习

package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.nio.charset.Charset; import org.xvolks.jnative.JNative; import org.xvolks.jnative.Type;import org.xvolks.jnative.exceptions.NativeException; imp

VC调用matlab dll方式混合编程(c风格--例2)&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -B csharedlib:ellipsefit ellipsefit.m (此方式为c风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序设计>刘维,第

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性

本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为"JAVA调用动态链接库DLL之JNative学习"中使用的DLL,仅仅是项目及文件名不同. 创建动态链接库项目:1.打开Microsoft Visual Studio 2010,选择文件->新建->项目. 2.在新建项目窗体中选择其他语言->Visual C++->Win32. 3.选择Win32 项目,设置名称:simpleDLL.设置解决方式名:simpleDLL.4.