将dllimport从vb6转换为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”关键字的地方,我只

我在VB6中有一些代码,它从dll导入一个函数,它使用byVal和byRef关键字,我想把这些代码转换成C#3.5

  • 字符串的unicode编码会有问题吗

  • 我是否将vb6中的“byRef”变量声明为C#代码中的“ref”变量

  • 返回值作为“byVal”参数输入到VB6代码发送的字符串中,这是如何工作的,如果您希望允许函数编辑字符串,您不应该发送“byRef”吗?这个概念是否仍然适用于我的C代码

  • 我尝试从VB6中声明函数,参数类型仅为int、long和string。在有“byVal”关键字的地方,我只是将其留空,并在C#中将“byRef”关键字替换为“ref”关键字,代码不起作用

    VB6代码:

    Private Declare Function Foo Lib "Foo_Functions.dll" (ByVal a as String, ByVal b
    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
    
    请注意,VB6
    Long
    已转换为
    Integer
    ,VB6
    Integer
    已转换为
    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
    
    请注意,VB6
    Long
    已转换为
    Integer
    ,VB6
    Integer
    已转换为
    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)相同。我将