从.NET调用DLL的问题

时间:2012-02-08 13:13:17

标签: vb.net com vb6

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

  

发生了AccessViolationException

     

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

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

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

我的VB6 DLL需要3个字符串和一个32位数字(VB6中的长整数)参数。我调用的第三方的DLL函数是一个字符串(bstrDNSID作为字符串是Intellisense在VB6中显示的)。这是错误的地方。

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

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

3 个答案:

答案 0 :(得分:0)

这并没有真正回答你的问题,但我无法在评论中使用这些例子。

当将字符串封送到来自.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?

答案 1 :(得分:0)

解决方法:

我找到了一个有效的解决方案。我只是在VB6中创建了一个名为第三方组件的ActiveX EXE。就像.NET的魅力一样。

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

答案 2 :(得分:-1)

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