VB6到COM可调用包装的.NET - 找到.NET库的问题

时间:2011-09-22 18:19:00

标签: c# .net vb6 com-interop

前提:

  • 编写了一个用C#编写的COM可调用包装器(CCW),用VB6代码调用。
  • C#代码包含必须使用的.NET库(第三方)。
  • 包装的C#类实例化正常,正确引发事件,正确接受方法调用。

问题:

  • 运行C#代码时,VB6代码在C#代码尝试访问上述其他.NET库时出错。

流程测试:

  • C#包装代码已完成。
  • 编写VB6代码,引用创建的COM dll。
  • “文件未找到...”当C#代码尝试从内部访问.NET库时收到错误。
  • 将第三方.NET库复制到VB6代码的主文件夹中(也进入system32文件夹)。
    • 仍然“找不到文件...”错误。
  • 写了一个C#Windows窗体测试项目。引用了C#包装代码。
    • 收到与VB6代码相同的错误。
  • 在C#Windows窗体测试项目中,引用了 C#包装代码使用的.NET库。
    • 程序运行得很好。

结论/问题:

  • VB6可以调用/使用引用其他第三方.NET库的可调用包装C#程序吗?

2 个答案:

答案 0 :(得分:0)

我已经完成了大量的第三方库,只要第三方库DLL与C#DLL位于同一目录中就不存在问题。

  1. 将它们复制到与VB6代码相同的目录中无效,VB6代码在VB6调试器中运行时的有效目录是%ProgramFiles%\ Microsoft Visual Studio \ VB98,因此运行的代码将无法看到
  2. system32目录与DotNet dll无关(他们唯一会影响的是PInvoke'd dll,你说你添加了一个引用,所以情况并非如此)。
  3. 将第三方库添加到GAC应该可以解决问题,但由于需要对DLL进行签名,因此不一定可行/容易。因此,只需确保您引用的库位于您的库的目录中,并且VB6实际上是引用该库的版本(Debug / Release,无论上次编译的是什么)。您可能希望将RegAsm交给库以确保正确的库是Com Registered。

    所以要贬低,假设您的源代码如下所示:

    c:\projects\vb6project
    c:\projects\c#project
    

    你的项目设置为Debug,第三方库应该在:

    c:\projects\c#project\bin\Debug
    

    当您确实要分发应用程序时,请确保所有库与VB6 exe位于同一目录中。

答案 1 :(得分:0)

这将反映Kris Erickson的答案。

首先,对于解决这些问题的用法,我没有使用GAC。假设我的VB6应用程序在c:\ program files \ mycompany \ _vb6app.exe中,我将COM友好的.NET dll(让我们称之为net4vb.dll)放在带有可执行文件的文件夹中。然后我使用/ codebase选项使用RegAsm注册那个dll。最后,我将我正在包装或使用的.NET程序集(也称为purenet.dll)放在该文件夹中。

此时,vb6app.exe应该运行且没有错误。

请务必注意,如果在Visual Studio中选择“注册COM Interop”,则会覆盖您在上面执行的注册。所以不要使用此选项。坚持使用命令行工具。