gpt4 book ai didi

c# - 将 dllimport 从 vb6 转换为 c# 3.5

转载 作者:太空宇宙 更新时间:2023-11-03 20:42:28 25 4
gpt4 key购买 nike

我在 VB6 中有一些代码从 dll 导入函数,它使用 byVal 和 byRef 关键字,我想将该代码转换为 C# 3.5。

  1. 字符串的 unicode 编码会不会有问题?

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

  3. 返回值被输入到由 VB6 代码作为“byVal”参数发送的字符串中,这是如何工作的,如果你想允许,你不应该发送东西“byRef”吗编辑字符串的功能?这个概念是否仍然适用于我的 C# 代码?

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

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

我的 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);

请帮忙,我已经在这上面花了一整天了:p....

最后,我使用自动项目转换器(从 VB6 到 VB.NET 2008)将函数调用转换为 VB.NET 库,并使用 C# 引用调用它。

谢谢。

最佳答案

如果您将可修改的 byVal 字符串替换为 C# 中的 StringBuilder,它们应该可以工作。另一种可能的解决方案是使用 [MarshalAs(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# 中的外观:

[DllImport("Foo_Functions.dll", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
private static extern short Foo([MarshalAs(UnmanagedType.VBByRefStr)] ref
string a, int b, [MarshalAs(UnmanagedType.VBByRefStr)] ref string c,
[MarshalAs(UnmanagedType.VBByRefStr)] ref string d,
[MarshalAs(UnmanagedType.VBByRefStr)] ref string e,
[MarshalAs(UnmanagedType.VBByRefStr)] ref string f, int g,
[MarshalAs(UnmanagedType.VBByRefStr)] ref string h,
[MarshalAs(UnmanagedType.VBByRefStr)] ref string i, ref int j, ref int k);

这是 VB6 声明的准确翻译,应该具有相同的行为。如果这仍然不起作用,那么也许您可以描述它究竟是如何不起作用的(非托管函数是否被调用过,参数是垃圾,返回值是垃圾,还是其他什么?)。

关于c# - 将 dllimport 从 vb6 转换为 c# 3.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1999423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com