Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VB6到COM可调用包装的.NET-查找.NET库时出现问题_C#_.net_Vb6_Com Interop - Fatal编程技术网

C# VB6到COM可调用包装的.NET-查找.NET库时出现问题

C# VB6到COM可调用包装的.NET-查找.NET库时出现问题,c#,.net,vb6,com-interop,C#,.net,Vb6,Com Interop,前提: 编写了一个用C#编写的COM可调用包装器(CCW),供VB6代码调用 C#代码必须使用.NET库(第三方) 包装好的C#类可以很好地实例化,正确地引发事件,正确地接受方法调用 问题: VB6代码在运行C#代码时,在C#代码尝试访问上述其他.NET库时出错 流程测试: 已完成C#包装代码 VB6编写的代码,引用COM创建的dll 当C代码试图从自身内部访问.NET库时收到“找不到文件…”错误 将第三方.NET库复制到VB6代码的主文件夹(也复制到system32文件夹)。 仍然

前提:

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

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

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

  • VB6能否调用/使用引用其他第三方.NET库的com可调用包装C#程序

我已经用大量第三方库完成了这项工作,只要第三方库DLL与C#DLL位于同一目录中,就不会有问题

  • 将它们复制到与VB6代码相同的目录中不会起任何作用,在VB6调试器中运行VB6代码时的有效目录是%ProgramFiles%\Microsoft Visual Studio\VB98,因此运行的代码将看不到该目录
  • system32目录与DotNet dll无关(它们影响的唯一dll是PInvoke的d dll,您说您添加了一个引用,所以情况并非如此)
  • 将第三方库添加到GAC应该可以解决问题,但是由于需要对DLL进行签名,这不一定是可能的/容易的。因此,只需确保所引用的库位于库的目录中,并且VB6实际上引用的是库的该版本(无论上次编译的是什么,都要进行调试/发布)。您可能需要手动重新命名库,以确保Com注册了正确的库

    因此,为了简化,假设您的源代码如下所示:

    c:\projects\vb6project
    c:\projects\c#project
    
    如果项目设置为调试,则第三方库应位于:

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

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

    我已经使用了大量第三方库完成了此操作,只要第三方库DLL与C#DLL位于同一目录中,就不会有问题

  • 将它们复制到与VB6代码相同的目录中不会起任何作用,在VB6调试器中运行VB6代码时的有效目录是%ProgramFiles%\Microsoft Visual Studio\VB98,因此运行的代码将看不到该目录
  • system32目录与DotNet dll无关(它们影响的唯一dll是PInvoke的d dll,您说您添加了一个引用,所以情况并非如此)
  • 将第三方库添加到GAC应该可以解决问题,但是由于需要对DLL进行签名,这不一定是可能的/容易的。因此,只需确保所引用的库位于库的目录中,并且VB6实际上引用的是库的该版本(无论上次编译的是什么,都要进行调试/发布)。您可能需要手动重新命名库,以确保Com注册了正确的库

    因此,为了简化,假设您的源代码如下所示:

    c:\projects\vb6project
    c:\projects\c#project
    
    如果项目设置为调试,则第三方库应位于:

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

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

    这将在某种程度上反映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互操作”,则它将覆盖您在上面所做的注册。所以不要使用这个选项。仅针对这一点使用命令行工具。

    这在某种程度上反映了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互操作”,则它将覆盖您在上面所做的注册。所以不要使用这个选项。为此,请仅使用命令行工具。

    尝试将第三方dll放入GACUse fuslogvw.exe中,以解决程序集解析问题。异常信息可能很有用,而且您可能忘记了“copy local==true”我没有使用第三方.NET库,但当COM和