C#中如何编写Dll的入口函数?
我是想在Dll入口函数里加些代码,但是不知道入口函数怎么写,网上大部分都是C++或者其它语言写的入口函数,我不太懂,请前辈指教了...具体要做的是用C#编写的dll注入到...
我是想在Dll入口函数里加些代码,但是不知道入口函数怎么写,网上大部分都是C++或者其它语言写的入口函数,我不太懂,请前辈指教了...
具体要做的是用C#编写的dll注入到其它进程中然后再执行一些代码,这步我基本实现了,然后想运用win32提供的LoadLibrary api函数来加载我用C#写的dll文件,但是dll必须遵循一定的编写规范,首先入口函数我不知道怎么写(切记是C#语言)?恳请各位大侠协助了!!!
反射貌似比较高深,lcg1986可不可以大概说说实现的来龙去脉?谢谢 展开
具体要做的是用C#编写的dll注入到其它进程中然后再执行一些代码,这步我基本实现了,然后想运用win32提供的LoadLibrary api函数来加载我用C#写的dll文件,但是dll必须遵循一定的编写规范,首先入口函数我不知道怎么写(切记是C#语言)?恳请各位大侠协助了!!!
反射貌似比较高深,lcg1986可不可以大概说说实现的来龙去脉?谢谢 展开
3个回答
展开全部
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.入口函数是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。
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。
强!!!
强!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询