.net开发一个C++可访问的DLL文件

xiulinwang123 2012-04-25 11:30:22
.net开发一个C++可访问的DLL文件,对方程式函数声明要求如下
int GetMacAddr2(char *IctNo, char *SerialNumber, char *MacNo, char *MacAddr)
如何用C#开发这个dll库,并公布此方法出去.
有人会说.net是托管环境,不可以直接将dll给C++访问,这里有个链接地址,
http://www.codeproject.com/KB/dotnet/DllExporter.aspx
它说明了如何在托管环境下开发一个dll 给非托管环境程式使用.
我的问题是,我声明跟此方法是一样的,可是对方C++就是抓取参数的返回值,
而后改用delphi 开发了个dll,公布的方法如下
function GetMacAddr2(IctNo, SerialNumber, MacNo, MacAddr: pchar): integer; stdcall;
这样开发的dll 给C++调用,可以通过参数来返回值,郁闷了.

请问各位如何用C#去公布这个方法
...全文
169 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2012-04-26
  • 打赏
  • 举报
回复
除了COM 的方法之外,还可以使用一个托管的C++ DLL来封装这个 .NET DLL.
在这个托管的 C++ 中,会自动加载 CLR。
然后在这个 DLL 中到处你需要的非托管的函数。

需要注意的是,当你的程序加载这个C++ DLL 的时候,只能当作非托管DLL 来加载,此时需要你在
DllMain 之中使用一个线程去加载你的托管 DLL,注意引用路径。
这个过程在早期的 混合模式下有BUG,在2008之后,好像好多了。

这个方法有个坏处,就是托管程序不能被卸载,除非你使用 AppDomain 。
但是 AppDomain 需要处理应用程序域。

我用这个方法把托管的DLL 注入到其他程序中。
足球中国 2012-04-26
  • 打赏
  • 举报
回复
非托管程序(delphi,vc)调用DLL函数的过程楼主要搞明白。
如果你搞明白这个相信这个你也会明白。

至于楼主要问的这个怎么用c++程序调用你的dll。这个东西很简单的。找个函数查询器的程序查看一下。就可以直接调用了。


楼主所看到的那个例子。是直接构造PE文件结构的。这个东西在软件破解里大量的用到。
因为c#的dll有很多动态的特性,这种做法对于.net的dll相当不稳定。
c#搞成com不是很简单。干么非要用这个不稳定的。
vinjent 2012-04-26
  • 打赏
  • 举报
回复
我認為你的C++是
int GetMacAddr2(char *IctNo, char *SerialNumber, char *MacNo, char *MacAddr)
所以C#應該是
int GetMacAddr2(string IctNo, string SerialNumber, string MacNo, string MacAddr)
但你說不行。所以按你這個
int GetMacAddr2(string IctNo, string SerialNumber, string MacNo, ref string MacAddr)
真的只是MacAddr傳不出去嗎?應該其它參數也沒辨法傳吧﹗
也許你可以試試[out, in]替代你的ref,也許你可以參考下面兩篇文章
http://topic.csdn.net/t/20060920/22/5036779.html
http://blog.yam.com/aluluba/article/40631110
xiulinwang123 2012-04-26
  • 打赏
  • 举报
回复
我定义成如下方式,仍然无法将MacAddr传出去,该如何定义
int GetMacAddr2(string IctNo, string SerialNumber, string MacNo, ref string MacAddr)
vinjent 2012-04-26
  • 打赏
  • 举报
回复
C++ char* = C# string
你這條式子並沒有要使用ref/[out,in]
int GetMacAddr2(char *IctNo, char *SerialNumber, char *MacNo, char *MacAddr)
xiulinwang123 2012-04-26
  • 打赏
  • 举报
回复
to vinjent
用了它这个DllExporter是可以将我的方法公布出去,对方也可以调用成功,只是不知如何定义参数的类型,能让对方调用时通过参数直接获取返回值,我定义的方法是返回int整型,这个对方是可以接收到的,但如何让参数像地址传递那样,将参数更新后的值返回给它调用的程式.我们平常都会在C#中加ref/out之类修饰,这些我都用了无效,后来定义成char*指针,也一样无效,用delphi写一个非托管dll,只要将参数定义成pchar,就可以用参数来返回值,所以要知道.net C#如何去完成这一点的.thanks
xiulinwang123 2012-04-25
  • 打赏
  • 举报
回复
to vinjent
C#开发的dll是托管代码,这一点我知道,难道.net就开发不出来非com形式的其它dll供其它程式访问吗?
早前我也是卡在这,不过看了这篇文章才发现是可以的.
http://www.codeproject.com/KB/dotnet/DllExporter.aspx
这个老外写了一个工具,可以实现我们都认为不行的功能.
用它的工具可以开发出非托管环境调用的dll函数库
vinjent 2012-04-25
  • 打赏
  • 举报
回复
哈﹗完全搞錯
C#一般開發的為.NetDLL是不能在非管託代碼中調用。所以你要開發API形式的DLL檔可能不行,但你可以將C#寫出來的.NetDLL設定為COMDLL,這樣非管託代碼亦可調用。
orochiheart 2012-04-25
  • 打赏
  • 举报
回复
不清楚能不能实现
xiulinwang123 2012-04-25
  • 打赏
  • 举报
回复
我不是在.net中去引用其它dll, 而是用.net去开发一个dll,能将上面的方法写进这个dll,给C++程式调用,
看到我链接地址文章,是可以用.net 环境开发给非托管环境使用的dll,而且我确实做成了.
现在逻辑是对方调用dll中方法是传入的参数是空的,必须由我方法里面赋值,然后再传递出去,我将参数定义成char*指针,对方仍然取不到我给参数定义的值,如果用delphi来开发这个dll,我就直接将公布方法的参数定义成pchar类型,对方访问时可以通过参数来获取值.所以不知道如何在.net去定义这个参数类型,能让C++程式访问时通过参数得到返回值.
  • 打赏
  • 举报
回复
LS的是引用C#使用C++的DLL

不一定能做到
vinjent 2012-04-25
  • 打赏
  • 举报
回复
using System.Runtime.InteropServices;

[DllImport("//dll位置")]
private static extern int GetMacAddr2(string IctNo, string SerialNumber, string MacNo, string MacAddr);
vinjent 2012-04-25
  • 打赏
  • 举报
回复
那個老外寫的重點應該是這個檔案DllExporter, 如果你用了這個還是公布不出來,那就是他沒寫完整(但已經讓我望塵莫及了, 有時間可以研究這個檔案看看囉﹗)
當然你在C++或Delphi要寫一個非托管API本來就不難,C++也一定可以調用。那為什麼不用C++或Delphi寫就好了,為什麼堅持要用C#,每一種語言本來就會有一些特定的用處,當然你只要一種走遍天下也可以,但技術要超強。所以你這個答案目前可能只能極少數的人能解,也許你可以問問那個老外﹗

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧