将dllimport从vb6转换为c#3.5
我在VB6中有一些代码,它从dll导入一个函数,它使用byVal和byRef关键字,我想把这些代码转换成C#3.5将dllimport从vb6转换为c#3.5,c#,vb6,interop,dllimport,C#,Vb6,Interop,Dllimport,我在VB6中有一些代码,它从dll导入一个函数,它使用byVal和byRef关键字,我想把这些代码转换成C#3.5 字符串的unicode编码会有问题吗 我是否将vb6中的“byRef”变量声明为C#代码中的“ref”变量 返回值作为“byVal”参数输入到VB6代码发送的字符串中,这是如何工作的,如果您希望允许函数编辑字符串,您不应该发送“byRef”吗?这个概念是否仍然适用于我的C代码 我尝试从VB6中声明函数,参数类型仅为int、long和string。在有“byVal”关键字的地方,我只
as Long, ByVal c as String, ByVal d as String, ByVal e as String, ByVal f
as String, ByVal g as Long, ByVal h as String, ByVal i as String, ByRef j
as Long, ByRef k as Long) As
Integer 私有声明函数Foo Lib“Foo_Functions.dll”(ByVal a作为字符串,ByVal b
作为长字符串,ByVal c作为字符串,ByVal d作为字符串,ByVal e作为字符串,ByVal f
作为字符串,ByVal g作为长字符串,ByVal h作为字符串,ByVal i作为字符串,ByRef j
作为长字符串,ByRef k作为长字符串)作为
整数 我的C#3.5翻译: [Dllimkport("foo_functions.dll")] public static extern int foo(String a, long b,
string c, string d, string e, string f, long g, string h, stringbuilder i,
ref long j, ref long k); [Dllimkport(“foo_functions.dll”)]公共静态外部intfoo(字符串a、长b、
字符串c、字符串d、字符串e、字符串f、长g、字符串h、字符串生成器i、
参考长j、参考长k); 请帮帮我,我已经花了一整天的时间在这上面了:p 最后,我使用自动项目转换器(从VB6到VB.NET2008)将函数调用转换为VB.NETlib,并使用C#reference调用它
谢谢。如果用C#中的
StringBuilder
替换可修改的byVal字符串,它们应该可以工作。
另一种可能的解决方案是使用[marshallas(UnmanagedType.VBByRefStr)]ref string i
我在Visual Studio中使用了“升级Visual Basic 6代码…”工具,这产生了以下VB.NET代码:
Private Declare Function Foo Lib "Foo_Functions.dll" (ByVal a As String, _
ByVal b As Integer, ByVal c As String, ByVal d As String, ByVal e As _
String, ByVal f As String, ByVal g As Integer, ByVal h As String, ByVal i _
As String, ByRef j As Integer, ByRef k As Integer) As Short
请注意,VB6Long
已转换为Integer
,VB6Integer
已转换为Short
。
然后我用反射器来观察它在C中的样子:
这是VB6声明的精确翻译,应该具有相同的行为。如果这仍然不起作用,那么也许您可以描述它到底是如何不起作用的(非托管函数是否被调用过,参数是否是垃圾,返回值是否是垃圾,等等?)。如果在C#中用
StringBuilder
替换可修改的byVal字符串,它们应该可以工作。
另一种可能的解决方案是使用[marshallas(UnmanagedType.VBByRefStr)]ref string i
我在Visual Studio中使用了“升级Visual Basic 6代码…”工具,这产生了以下VB.NET代码:
Private Declare Function Foo Lib "Foo_Functions.dll" (ByVal a As String, _
ByVal b As Integer, ByVal c As String, ByVal d As String, ByVal e As _
String, ByVal f As String, ByVal g As Integer, ByVal h As String, ByVal i _
As String, ByRef j As Integer, ByRef k As Integer) As Short
请注意,VB6Long
已转换为Integer
,VB6Integer
已转换为Short
。
然后我用反射器来观察它在C中的样子:
这是VB6声明的精确翻译,应该具有相同的行为。如果这仍然不起作用,那么也许您可以描述它到底是如何不起作用的(非托管函数是否曾经被调用过,参数是否是垃圾,返回值是否是垃圾,等等?).看一看,它显示了C#和VB.net示例。看一看,它显示了C#和VB.net示例。如果VB6声明语句将
ByVal s作为字符串包含,则该参数将被封送为指向ANSI字符串的指针。我会尝试将DLLImport更改为[DLLImport(“Foo_Functions.dll”,CharSet=CharSet.Ansi)]
对于输出参数,您需要使用StringBuilder s
,还需要预先初始化足够大的StringBuilder以容纳输出。对于输入参数,可以使用字符串s
您有DLL的C声明吗?Mabe在原始供应商的文档中,还是在DLL源代码中?如果是这样的话,有一个免费的工具可以将C声明转换为C#或VB.Net PInvoke代码。阅读更多
免责声明:如果VB6声明语句包含ByVal s作为字符串,则该参数将作为指向ANSI字符串的指针编组。我会尝试将DLLImport更改为[DLLImport(“Foo_Functions.dll”,CharSet=CharSet.Ansi)]
对于输出参数,您需要使用StringBuilder s
,还需要预先初始化足够大的StringBuilder以容纳输出。对于输入参数,可以使用字符串s
您有DLL的C声明吗?Mabe在原始供应商的文档中,还是在DLL源代码中?如果是这样的话,有一个免费的工具可以将C声明转换为C#或VB.Net PInvoke代码。阅读更多
免责声明:这个答案应该得到任何代表分数,因为他是。如果您在问题中包含导入函数的VB6 declare,我可能会有所帮助。如果没有任何代码,则很难正确理解您要做的事情。您是否试图从c#调用win32 dll中的函数?另外,请注意,VB6中的长变量与c#中的Int32(int)相同。我建议在您的问题中粘贴原始dll函数声明(很可能是c). 我的建议很简单,因为VB6中的导入常常是在C#b/C中实际上应该是Int32的情况下对Integer这样的东西进行的,所以原始C返回了一个句柄。除非我们得到最原始的,否则很难说。如果您在问题中包含导入函数的VB6 declare,我可能会有所帮助。如果没有任何代码,则很难正确理解您要执行的操作。您是否试图从c#调用win32 dll中的函数?请注意,VB6中的长变量与c#中的Int32(int)相同。我将