VC写的dll,VB.net调用已经成功,C#调用失败,求解决办法

abcynic 2004-04-14 09:01:07
------------------------------------------
VC中dll的函数定义
# define DLLIMPORT __declspec (dllexport)

extern "C" int DLLIMPORT EnCode(char* sUnCoded,char* sEnCoded)

--------------------------------------
VB.net调用
Private Declare Ansi Function EnCode Lib "EnCode.dll" (ByVal o1 As String, ByVal o2 As String) As Integer


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim un As String
Dim en As String
Dim rel As Integer

un = TextBox2.Text
en = "123456789012345678901234567890123456789012345678901234567890"
rel = EnCode(un, en)
If rel = 0 Then
TextBox1.Text = en.ToString
End If

End Sub
------------------------------------------------------
C#中试图调用方法
[DllImport("EnCode.dll",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
private static extern int EnCode(string un,ref string en);
private void button1_Click(object sender, System.EventArgs e)
{
string aa = new string('0',50);
string bb = new string('1',6);
EnCode( bb,ref aa);
this.textBox2.Text = aa;


}
----------------------------------------------
其中private static extern int EnCode(string un,ref string en);
试图用private static extern int EnCode(string un,out string en);亦不成功
报错误
System.NullReferenceException: 未将对象引用设置到对象的实例。
at callencodedll.Form1.EnCode(String un, String& en)
...................................

请问对于VB.net可以用byVal传递的string类型,c#中应当用什么数据类型传递?

...全文
66 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
abcynic 2004-04-14
  • 打赏
  • 举报
回复
此问题我已经自己解决
原因是VB中用ByVal的参数,编译后自动加有marshal( byvalstr)
用C#必须用[MarshalAs(UnmanagedType.VBByRefStr)]指定才能有相同的编译结果。
函数定义应该是
private static extern int EnCode([MarshalAs(UnmanagedType.VBByRefStr)]ref string un,[MarshalAs(UnmanagedType.VBByRefStr)]ref string en);
我用ildasm.exe查看了编译结果才发现这个不同。
可惜了100分,大家再讨论讨论或者顶一下,就当我散分吧。
Jinniu 2004-04-14
  • 打赏
  • 举报
回复
string en = "";
private static extern int EnCode(string un,ref string en);

ref需要先赋一个值才能使用!
Grid++Report 报表构件适用开发工具广泛:VB.NETC#.NETVBVC、Delphi、CBuilder、PowerBuilder等一切支持 COM 的开发工具。除了提供报表的打印、打印预览、数据导出等一般功能,还提供独有的报表查询显示功能,为你提供最全面的报表解决办法。实现表格报表、动态报表、多层表头、票据套打、交叉表等特殊报表非常简便。提供了多个开发工具下的丰富例程,让你快速理解本产品,安装程序中包含丰富的可运行例子,安装后即刻体验 Grid++Report。Grid++Report 报表构件具有如下特点:1). 适用范围广:VB.NETC#.NETVBVC、Delphi、CBuilder、PowerBuilder等一切支持 COM 的开发工具。2). 功能强大:实现普通格式报表、表格报表、动态报表、多层表头、票据套打、交叉表等各种报表非常简便。3). 独有的报表查询显示功能:除了提供报表的打印、打印预览、数据导出等功能,还提供独有的报表查询显示功能,为你提供最全面的报表解决办法。4). 易学易用:完全可视化设计。编了完整详尽的帮助文档。提供了丰富例程,包括VB.NETC#VBVC、Delphi、CBuilder。安装程序中包含可运行例子,安装后即刻体验 Grid++Report。5). 为 Delphi、C++Builder 编专门的包装类,象使用 VCL 构件一样使用 Grid++Report。6). 重新发布简单:只用分发两个 DLL 文件。7). 提供免费版本供广大开发者使用。

110,566

社区成员

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

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

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