C#中如何编写Dll的入口函数? c#到底可不可以编写带dllmain入口的dll库文件

www.zhiqu.org     时间: 2024-06-17
C#不能写你说的那种DLL,C#写的DLL只是个类库,不是标准DLL.
你说的那是标准DLL.入口函数是DllMain函数

补充:如果是标准DLL,C#无能为力.

都跟你说了C#写的DLL不是标准DLL.只是个类库.所以不可能用LoadLibrary来调用.
你既然已经注入了,可以用反射来实现调用

你可以通过Assembly.LoadFrom(路径)这个函数来加载C#的DLL.这样加载的DLL和Library加载的是一样的,都是注入所有进程空间的.
Assembly assembly = Assembly.LoadFrom(strValue);

然后得到这个assembly之后.可以得到这个加载DLL类的所有,比如类的构造函数
Type tmpType = assembly.GetType(dataType);
ConstructorInfo objConstructor = type.GetConstructor(System.Type.EmptyTypes);

然后通过objConstructor 构造类的对象
if (objConstructor != null)
{
objDataAccess = (IDataAccess)objConstructor.Invoke(null);//调用构造
}

得到具体对象之后可以通过对象的InvokeMethod来调用具体的方法

一、什么是DLL 以及使用它的好处
1、DLL 即:动态链接库
  DLL是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。(来自百度)
2、DLL的好处主要有:
  1)当程序越来越庞大时,DLL避免了EXE文件的过大。分成DLL之后,不用把全部功能都集中到EXE里,需要的时候才调入内存。
  2)DLL模块化了生产程序。DLL是产品,EXE就是个集装箱。因此对DLL模块的更新只需要替换此DLL文件即可,不用更新整个程序。
  3)编译EXE时,不用编译DLL的内容,加快了编译速度。
  4)DLL可重用。当一个DLL模式设计好之后,可以被其它项目或程序所引用。
  5)DLL可以起到保密的作用。也就是说DLL可以将实现功能的源代码隐藏起来,调用者只能使用而不能看到其内部代码。

“动态链接”这几字指明了DLLs是如何工作的。对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传送给调用这些函数的程序。而对于DLLs,函数储存在一个独立的动态链接库文件中。在创建Windows程序时,链接过程并不把DLLs文件链接到程序上。直到程序运行并调用一个DLLs中的函数时,该程序才要求这个函数的地址。此时Windows才在DLLs中寻找被调用函数,并把它的地址传送给调用程序。采用这种方法,DLLs达到了复用代码的极限。

二、在VS2010中如何创建和编写DLL
方法很简单,就是在程序的解决方案中添加一个项目,然后选择“类库”。注意,一定要在“解决方案”上添加项目才行,在项目中只能添加类文件了。类库项目一但添加,在程序编译的时候就会自动生成为DLL文件。
至于编写DLL 这和编写类文件代码是一致的。你可以在多个CS类文件中编写,也可以全放在一起CS类文件中编写。当然推荐的方式是根据功能分类将类库分别写在不同的CS文件中。(虽然在不同文件中,但同属一个项目的类文件会被编译进一个DLL库文件中)

三、在VS2010中如何使用自己编写的DLL
方法也很简单,在你的程序中的解决方案管理器里,找到“引用”然后点右键添加,在弹出的对话框中选择“浏览”,然后选择你刚才创建并编译过的DLL文件。然后在程序文件中使用using 来引入你DLL中的命名空间。注:如果DLL项目就在你当前的程序解决方案中,那么你可以直接在添加“引用”中选择“项目”而不是“浏览”。这样就可以直接引用本解决方案中编写的DLL类库。

四、在VS2010如果让DLL文件通过引用添加到新程序后依然可以在新程序代码中通过智能感知看到代码的注释(只包含那些\\\的注释 \\和\**\的注释是无法看到的)
方法是:在你创建DLL类库之后,右键单击这个DLL类库项目的属性,然后点击“生成”标签,在“输出”区域勾选 XML文档文件即可。每次在生成DLL项目时就会多生成一个同名的XML文件,打开这个文件可以看到里面全部是DLL当中的注释内容了(只包含\\\的注释)。从这里也可以看出,智能感知中看到的代码注释其实就是从XML中读取相应内容然后显示给程序员看。只要XML和DLL在同一文件夹下,VS在导入DLL的时候会自动将同名的XML也导入进来,用户不必手动复制。

五、其它
在使用DLL的时候还有一种方法是使用[DLLImport("yourdll.dll")]。这是com组件的使用方式,在VS中微软不推荐这样的方式使用DLL。

lz 是不是说没有源码,直接修改编译好的dll。
强!!!

c#怎么创建包含入口函数的dll?~

c#创建的的dll是托管代码,没有入口函数的
普通的c++并不能调用c#创建的dll

C#只允许一个程序入口Main函数 但是类库文件WinForm、控制台等生成的类库可以被其他程序调用。使用时 类库文件最好去掉主函数


#夔忽律# C#调用mfc的dll -
(15962029355): 在使用外部的非.NET托管的DLL的时候,通常你要知道这个dll中公开了那些接口(一般情况下只有公开的方法有用).例如:在一个用C语言编写的用来读取串口上IC卡读卡器的dll中公开了如下的方法.int auto...

#夔忽律# c#中怎样运行调用的dll文件 -
(15962029355): 动态链接库函数的声明 动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者通过 Api Viewer粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作. 动态链接库函数声明部分一般由下列两部分组成,一是...

#夔忽律# C#如何编写并调用DLL
(15962029355): 在新建项目的地方选择类库, 然后会有一个Class1.cs文件. 内容改为:namespace ClassLibrary1{ public class Class1 { public string M() { return "String"; //返回字符串"String" } }}然后生成该类库, 在.../bin/debug或.../bin/release下得到*.dll...

#夔忽律# C#调用DLL中 DllImport 属性详解 -
(15962029355): DLL Import 属性 现在是更深入地进行探讨的时候了.在对托管代码进行 P/Invoke 调用时,DllImportAttribute 类型扮演着重要的角色.DllImportAttribute 的主要作用是给 CLR 指示哪个 DLL 导出您想要调用的函数.相关 DLL 的名称被作为一个构造...

#夔忽律# C# 怎么写可导出函数的DLL项目呢? -
(15962029355): C#是写不出可以用 DLLImport引用的这种DLL的C#生成的都是托管代码,任何函数都属于某个类,不存在独立的函数,使用的时候需要引用该DLL,并在代码中导入名称空间,下面是一个使用楼主t1.dll的控制台程序示例将下面的代码保存成1.cs 在VS命令行输入 csc 1.cs /r:t1.dllusing System;using t1; class Program{ static void Main() { int i = 0; Class1.Start(i); //调用DLL中的方法 Console.WriteLine(i); //输出 }}

#夔忽律# 怎样在C#中调用DLL中的函数,最好有代码和详细说明 -
(15962029355): 是 C#写的dll吗 ,如果是,先引用dll,在类文件中用using 命名空间.然后就可以直接调了.如果不是,用p/invoke

#夔忽律# 用C#编写DLL文件 -
(15962029355): 如果你的VS是中文版,照如下步骤: 1.打开VS,文件->新建->项目,弹出对话框选“类库”. 2.新建好的类库下有一个默认的类Class1,你还可以点右键往类库中添加新类.往类中写好代码 3.解决方案资源管理器中点右键,选“生成”,然后...

#夔忽律# C#中怎样引用c编写的dll -
(15962029355): 使用C#生成dll文件并调用 一、创建dll文件:例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果相等返回true,否则返回false.打...

#夔忽律# 用C#编写DLL文件
(15962029355): 如果你的VS是中文版,照如下步骤: 1.打开VS,文件->新建->项目,弹出对话框选“类库”. 2.新建好的类库下有一个默认的类Class1,你还可以点右键往类库中添加新类.往类中写好代码 3.解决方案资源管理器中点右键,选“生成...

#夔忽律# c#调用c++中的类 -
(15962029355): 非托管的类要引用,先要新建一个C#类库,把这个dll放到debug目录中,写好你的代码(dllimport之类的),然后生成,这样就得到你的托管的dll文件,然后在你的项目中引用即可