【问题标题】:Problems calling a DLL from .NET从 .NET 调用 DLL 的问题
【发布时间】:2012-02-29 22:15:42
【问题描述】:

我有一个包装对第 3 方组件的调用的 VB6 DLL。当我从 VB6 调用我的 DLL 时,一切正常,但是当我从 vb.net(针对 2.0 框架 - VS2010)调用它时,我收到此错误:

发生AccessViolationException

试图读取或写入受保护的内存。这通常是一个 指示其他内存已损坏。

此错误仅在 Windows 7 上发生(Windows XP 客户端工作正常)。

我查过这个,我发现的所有文章都谈到声明不正确。不过,我没有声明任何 API 调用,第 3 方组件在我的 VB6 DLL 中是早期绑定的。我可以运行 DLL,设置断点,然后它进入我的 VB6 函数,但在调用 3rd 方组件中的函数时出错。

我的 VB6 DLL 采用 3 个字符串和一个 32 位数字(在 VB6 中为长)参数。我正在调用的第 3 方的 DLL 函数采用字符串(bstrDNSID 作为字符串是 Intellisense 在 VB6 中显示的内容)。这是它出错的地方。

有谁知道如何解决这个问题?

更新: 编组都没有帮助,所以我尝试在我的 VB6 DLL 中创建一个测试子。我硬编码了 DLL 的测试子中的所有值。从 VB6 调用时它工作正常,但从 .NET 运行时会出现与上述相同的错误。同样有趣的是,当我从 VB6 IDE 运行 VB6 DLL 时,从 .NET 调用 DLL 时不会出现错误。

【问题讨论】:

  • 第三方组件是COM吗?您正在调用的函数的参数类型是什么?这是一个非常普遍的错误,但是当我没有正确编组字符串时,我得到了它。
  • @Mark - 这根本不是我的问题。我知道如何从 .NET 调用 VB6 DLL,反之亦然。
  • @ken 我已经更新了我的问题。如何正确编组字符串?我想通过调用 VB6 DLL 我不需要编组任何字符串。
  • @Mark 这不是重复的。

标签: vb.net com vb6


【解决方案1】:

这并不能真正回答您的问题,但我无法将这些示例放入 cmets。

当从 .NET 将字符串编组为非托管 DLL 调用时,我有时会收到 AccessViolationException,因为我没有指定正确的字符集。我通过将IntPtr 显式转换为我需要的字符集中的字符串来修复它。

[DllImport("MyDLL.dll", CharSet = CharSet.Ansi)]
static extern void do_something(IntPtr str);

void DoSomethingWrapper(string str) {
    var ptr = Marshal.StringToHGlobalAnsi(str);
    do_something(ptr);
}

您可能需要Marshal.StringToBSTR。我不知道您是否可以使用指针调用 VB6 函数,或者您是否必须在 VB6 DLL 中创建指针。

这是一个您可能会觉得有用的问题:How can I get the charset VB6 is using?

【讨论】:

  • 谢谢。我目前没有任何 P/Invoke 语句,因为我的 DLL 只是作为参考添加并生成了互操作。你认为我不需要直接引用 DLL 并使用 P/Invoke 声明吗?
  • 这绝对是我会尝试的。
  • 我还会尝试使用正确的字符集直接从 .NET 调用该函数(跳过 VB6 层),看看它是否有效,如果可能的话。
  • 我会试试的。我实际上创建了 VB6 包装器,因为我认为当我将第 3 方引用直接添加到 .NET 时它会解决问题
【解决方案2】:

解决方法:

我找到了一种可行的解决方案。我只是在 VB6 中创建了一个名为 3rd 方组件的 ActiveX EXE。像 .NET 的魅力一样工作。

另外值得注意的是,我从未创建过 ActiveX EXE,也不知道 regsvr32 无法注册它。 Here 是注册 ActiveX EXE 的正确方法。

【讨论】:

  • 我接受我的回答,因为这是我用来解决该问题的解决方案。
【解决方案3】:

VB6 可能将整数声明为 16 位。这也是从 VBA 调用 DLL 的问题。解决方案应该是将整数更改为 long

【讨论】:

  • 您的回答如何解释为什么 Windows XP 有效而 Windows 7 无效?另外,我特别指出传递的数字被声明为 long。
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多