1建立一个C++的Win32DLL,这里要注意选择"Export symbols"导出符号。点击完成。 如下图所示:
2由于项目的名称是"TestCPPDLL",因此,会自动生成TestCPPDLLh和TestCPPDLLcpp两个文件,h文件是要导出内容的声明文件,为了能清楚的说明问题,我们将TestCPPDLLh和TestCPPDLLcpp两个文件中的所有内容都删除,然后在TestCPPDLLh中添加如下内容:
3第一行代码中定义了一个名为"TESTCPPDLL_API"的宏,该宏对应的内容是"__declspec(dllexport)"意思是将后面修饰的内容定义为DLL中要导出的内容。
第二行的代码是一个函数的声明,说明该函数可以被模块外部调用,其定义实现在TestCPPDLLcpp中,TestCPPDLLcpp的代码如下所示:
4在编译C++DLL之前,需要做以下配置,在项目属性对话框中选择"C/C++"|"Advanced",将Compile AS 选项的值改为"C++"。然后确定,并编译。
5生成的DLL文件如下图所示:
6首先,添加一个C#的应用程序,如果要在C#中调用C++的DLL文件,先要在C#的类中添加一个静态方法,并且使用DllImportAttribute对该方法进行修饰,代码如下所示:
7DllImport中的第一个参数是指明DLL文件的位置,第二个参数"EntryPoint"用来指明对应的C/C++中的函数名称是什么。"extern"关键字表明该处声明的这个Add方法是一个外部调用。
该方法声明完毕之后,就可以像调用一个普通的静态方法一样去使用了。
下面是示例程序:
8然后运行该C#程序,其结果如下图所示:
1、创建DLL工程,点击文件->新建->项目->visual c++->win32->win32控制台应用程序(win32项目也可以)。
2、填写项目名称MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成。
3、到这里DLL工程就创建完毕了,下面新建两个文件MyDLLcpp和MyDLLh。
4、然后分别添加DLL的代码:
MyDLLcpp
#includeusing namespace std;
#include "MyDLLh"
int Add(int &a,int &b)
{
return a+b;
}
MyDLLh
#pragma onceextern "C" __declspec(dllexport) int Add(int &a,int &b);
5、点击生成Bulid -->Bulid MyDLL,dll文件就生成了。
使用C#生成dll文件并调用一、创建dll文件:
例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果相等返回true,否则返回false。
打开VS 2005,“文件”--》“新建”--“项目”,选择“Windows 控件库”,命名后点击“确定”,在“UserControl1cs”中输入以下代码:
using System;
using SystemCollectionsGeneric;
using SystemComponentModel;
using SystemDrawing;
using SystemData;
using SystemWindowsForms;
using SystemText;
using SystemSecurityCryptography;
namespace md5
{
public partial class Program : UserControl
{
#region MD5 32位加密:GetMd5Str32
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <returns>加密后的字串</returns>
public static string GetMd5Str32(string strSource)
{
byte[] bytes = EncodingASCIIGetBytes(strSource);
byte[] hashValue = ((SystemSecurityCryptographyHashAlgorithm)SystemSecurityCryptographyCryptoConfigCreateFromName("MD5"))ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 16; i++)
{
sbAppend(hashValue[i]ToString("x2"));
}
return sbToString()ToUpper();
}
#endregion
#region 核对md5编码是否一致:CheckMd5String()
/// <summary>
/// 核对md5编码是否一致
/// </summary>
/// <param name="ConvertString"></param>
/// <returns>如果一致返回true,否则返回false</returns>
///
public static bool CheckMd5String(string str1, string str2)
{
string md5String = str1; //需要验证的字符串
string md5DbString = str2; //需要核对的32位md5编码
int result = stringCompare(md5ProgramGetMd5Str32(str1), md5DbString, true);
if (result == 0)
{
return true;
}
else
{
return false;
}
}
#endregion
}
}
修改“UserControl1Designercs”中的命名空间为“md5”,方法为“Program”,即可生成dll文件。
在\bin\Debug文件假下,可以找到相应的dll文件。
二、部署dll流程:
首先把dll文件放到应用程序\bin\Debug\下;
然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。
注意:要在应用文件头处使用using md5;命令。
测试应用程序代码,如下:Form1cs
using System;
using SystemCollectionsGeneric;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemText;
using SystemWindowsForms;
using md5;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str1 = textBox1TextToString();
string md5String = textBox2TextToString();
textBox3Text = md5ProgramGetMd5Str32(str1);
textBox4Text = md5ProgramCheckMd5String(str1, md5String)ToString();
}
private void button2_Click(object sender, EventArgs e)
{
thisClose();
}
}
}
三、注意点:
1、在C#应用程序开发过程中,加载dll文件时,报错“未能加载文件或程序集“md5, Version=2000, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。”,请指点一下是什么原因?
解决:这是因为加载dll的路径问题,正确加载方式为:在“解决方案”的“引用”文件上右击鼠标,选择“添加引用”---》在“浏览”选项卡中添加引用(注意:自己定义的dll文件不能在“NET”选项卡中添加。)
------------------------------------------------------------------------------------------------------------------
c#生成DLL文件,内部函数的问题
用C#编写一组处理XML文档的代码,由于要求生成DLL文件,并由外部的其他工具访问动态库中的文件,
但是用Dependency Walker检测我生成的这个DLL文件没有显示任何的函数,以前没做过这方面的东西,求教了
代码如下:
using System;
using SystemIO;
using SystemXml;
public class Sample
{
public static void Main()
{
DeleteArg();
}
static void DeleteArg()
{
XmlDocument doc = new XmlDocument();
docLoad(@"c:\\data1xml");
XmlNode root = docDocumentElement;
XmlNode Node1;
XmlNodeList nodeList = docSelectSingleNode("/Entity/Columns")ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xeGetAttribute("Name") == "SysModuleID")
{
xeRemoveAll();
//xeRemoveAttribute("Name");//删除Name属性
}
}
docSave("c:\\data1xml");//保存这个文档到文件中
}
}
以上代码实现删除XML文件中某一节点的功能,如何在生成DLL后能够使用检测工具检测出DeleteArg函数,
使用Dependency Walker没检测出该函数是不是以为着这个动态库文件不能被调用
----
因为net的程序不是这样把函数放在导出表的, 我记得net做的dll只导出了一个_CorDllMain的方法,
所以用Dependency Walker是看不出来的 如果你想看net做的dll导出了什么内容,可以用反射查看元数据
----
生成这个DLL库文件,是想要别的工具运行这个动态库文件,实现DELETEARG()这个函数的功能
----
可以的
----
你上面的代码不是生成DLL的,而是一个控制台应用程序
要想创建动态库(DLL),在新建项目窗口中选择"类库", 默认的代码是这样的:
using System;
using SystemCollectionsGeneric;
using SystemText;
namespace ClassLibrary2
{
public class Class1
{
}
}
// 然后添加你的代码最后代码如下:
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemXml;
namespace ClassLibrary2
{
public class Class1
{
public void DeleteArg()
{
XmlDocument doc = new XmlDocument();
docLoad(@"c:\\data1xml");
XmlNode root = docDocumentElement;
XmlNode Node1;
XmlNodeList nodeList = docSelectSingleNode("/Entity/Columns")ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xeGetAttribute("Name") == "SysModuleID")
{
xeRemoveAll();
//xeRemoveAttribute("Name");//删除Name属性
}
}
docSave("c:\\data1xml");//保存这个文档到文件中
}
}
}
最后编译一下就可以,
在Debug文件夹下回产生一个dll文件,最后在需要的工程里,将这个dll文件引进进去就可以用
通过dll文件生成对应的lib文件的方法
这里我用的是vs2008,百度下载vs2008,然后安装。
安装完成后是配置软件的PATH,如下图所示,右击选择“属性”。
在d出的窗口中选择“高级系统设置”,如下图所示。
然后如下图所示,点击“环境变量”。
在系统变量一栏中找到PATH,双击后就可以修改了。
在d出的编辑窗口中输入vc的bin路径,然后保存退出。
打开windows下的控制台窗口CMD,进入到Dll所在的路径。
执行以下命令生成一个def文件:pexports mydlldll -o > mydlldef
最后执行以下命令就可以生成一个lib文件了:lib /machine:ix86 /def:mylibdef
如果使用的是VS,可以进行如下 *** 作:
打开VS, 文件-新建-新建项目-其他语言-Visual C++ - Win32 控制台应用程序。
单击确定后,d出对话框,按照对话框“下一步”提示进行 *** 作。
将要编译的C文件拷贝到CreateDLL项目中,h文件就放到头文件夹的目录下,c文件放到源文件目录下,注意后缀名为c的文件都要改成cpp,否则编译会出错。
注意:申明函数时必须参照上图红框标示出来的规则,在Functioncpp文件中必须要引入对应的#include CreateDLLh。
选中所有需要编译成dll的cpp文件,右键-属性-预编译头-不使用预编译头,然后选择 “生成”即可,这样在项目的Debug文件夹下面便可找到CreateDLLdll文件
1、从“文件”菜单中,选择“新建”,然后选择“项目…”。
2、从“项目类型”窗格中选择“Visual C++”下的“Win32”。
3、从“模板”窗格中,选择“Win32 控制台应用程序”。
4、为项目选择一个名称,如“MathFuncsDll”,并将其输入“名称”字段。为解决方案选择一个名称,如“DynamicLibrary”,并将其输入“解决方案名称”字段。
5、按“确定”启动 Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6、从“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的 Visual Studio 不支持使用向导创建 DLL 项目。您可以稍后对此进行更改,以将项目编译为 DLL。
7、从“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)