如何让.NET库和Win32原生库融合在一起 在使用SQLite的时候,下载了SQLite的ADO.NET2.0的驱动。它是一个Dll文件,但是我发现它除了封装了System.Data.SQLite命名空间之外,还能当作普通Win32 Dll文件使用,被C语言链接。把2种不同平台的库融合在一起是如何做到的呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个技术不错,整合的好,upUpUpC#专业 QQ群:1803321 欢迎加入! 我是c#的初学者,如果我说得不太好,请不要见怪。:)c#里面有个PInvoke服务,它是管理代码和未管理代码的桥梁,它可以使管理代码调用未管理代码中的函数(比如说user32.dll中的函数)。PInvoke服务可以跨过互用边界,定位和调用外部函数,并对其参数整合,包括整数、字符串、数组和结构等。PInvoke服务的主要步骤是:1、查找包含某个函数的自定义DLL.2、将DLL加载入内存;3、在内存中定位函数的地址,将其参数压栈,按需整合数据。这些动作仅在第一次调用该函数时发生;4、将控制权转给未管理的函数使用该服务时,应用程序需要使用属于System.Runtime.InteropServices命名空间,该命名空间里包括Marshal类和DllImport属性。其中Marshal类就是用来拷贝未管理的内存块,把未管理的类型转化成管理的类型。DllImport属性被使用在如下语句中,就可以使用user32.dll的函数了:[DllImport("user32.dll",EntryPoint = "FindWindow")]private static extern int FindWindow(string lpClassName,string lpWindowName);然后在main()里面使用:int iHandle=FindWindow(null,"Untitled - Notepad");就可以调用FindWindow()来返回一个记事本的类名了。 我补充一下问题:SQLite下载的时候自带一个SQLite3.dll和一个Def文件,用来产生lib文件。但是那个System.Data.SQLite.dll和这个自带的SQLite3.dll没有任何区别,配合那个def文件也能正常产生lib文件,用DLL Viewer查看时解析出的函数也一样。但是它同时可以被.NET SDK带的ILDAsm解析,而且用.NET反编译器也能反编译出正常的C#代码。同一个文件在两个平台上各自拥有功能,且互不影响。觉得很新奇。 .net产生的.dll(PE格式的)具有过去Windows可执行.dll程序库的全部结构,包括各种代码、数据段定义,入口程序。仅仅是扩充了其它的段落。当此.dll不能被旧的机制启动的时候,其实仍然是执行了旧的入口程序部分写的一段“警告”程序。 刚才一个朋友给了我System.Data.SQLite那个项目代码,发现目录中有一个工具叫mergebin.exe。从说明看,可以合并.NET DLL 和 Native DLL,没有代码,原理不明。 你搜索.net的各种不同的linker。不过我这实在看不出有什么必要。你不如研究更有用的,把多个assembly(dll和exe)合并在一起,以及可以将exe翻译成本地机器代码(脱离.net framework)。Salamandar、Xenocode等都有此功能。 up---------------------------------------------------------------------------------------------腰缠70元到月入近10万http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=453IT工程师 毕业4年我年薪涨到30万 http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=51126岁青年坐拥千万域名资产 从小玩家变成CEO http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=515程序员的酸甜苦辣:告别Coding http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=341从月薪3500到700万(一)http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=170网络草根月赚3000的十种方法http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=517如果我是女的 我肯定不会嫁给做网站的http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=512 请教一个问题,有一个ocx控件,有x86和x64两个版本。我怎么在vs2010中调用x64版本的ocx呢 C#开发一个局域网的管理软件 操作速度很慢 还请高手进来看看 求一个生成纯数字的加解密 c#如何在richtextbox中显示word文档? Workflow 启动的时候出现问题 我看好多论坛都能获取用户的ip,这是怎么做的? 全局变量问题 C#调试时出的问题? 我想用鼠标拖动form上画的一个方块,要做那些工作呢? 一个窗口的子窗口在异步调用函数后,如何关闭自身? 线程访问控件的问题 Attributes(跳出选择对话框要如何实现)
C#专业 QQ群:1803321 欢迎加入!
c#里面有个PInvoke服务,它是管理代码和未管理代码的桥梁,它可以使管理代码调用未管理代码中的函数(比如说user32.dll中的函数)。PInvoke服务可以跨过互用边界,定位和调用外部函数,并对其参数整合,包括整数、字符串、数组和结构等。
PInvoke服务的主要步骤是:
1、查找包含某个函数的自定义DLL.
2、将DLL加载入内存;
3、在内存中定位函数的地址,将其参数压栈,按需整合数据。这些动作仅在第一次调用该函数时发生;
4、将控制权转给未管理的函数使用该服务时,应用程序需要使用属于System.Runtime.InteropServices命名空间,该命名空间里包括Marshal类和DllImport属性。其中Marshal类就是用来拷贝未管理的内存块,把未管理的类型转化成管理的类型。DllImport属性被使用在如下语句中,就可以使用user32.dll的函数了:
[DllImport("user32.dll",EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName,string lpWindowName);
然后在main()里面使用:
int iHandle=FindWindow(null,"Untitled - Notepad");
就可以调用FindWindow()来返回一个记事本的类名了。
同一个文件在两个平台上各自拥有功能,且互不影响。觉得很新奇。
腰缠70元到月入近10万
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=453IT工程师 毕业4年我年薪涨到30万
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=51126岁青年坐拥千万域名资产 从小玩家变成CEO
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=515程序员的酸甜苦辣:告别Coding
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=341从月薪3500到700万(一)
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=170网络草根月赚3000的十种方法
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=517如果我是女的 我肯定不会嫁给做网站的
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=512