【问题标题】:Issue in running .net 2.0 dll on vb6在 vb6 上运行 .net 2.0 dll 时出现问题
【发布时间】:2018-01-17 01:15:02
【问题描述】:

VB6 项目中的 Net framework 2.0 dll。 .Net Framework 4.5 中的相同代码(命名空间是 PasswordHashLibrary 而不是 PasswordHashLibrary2.0)在 vb6 项目上运行良好,但这次我缺少一些东西。

这是我在 .net v2.0 上的 c# 代码

//using statements here

namespace PasswordHashLibrary2._0
{
public interface ComClassInterface
{
}

public class Hash : ComClassInterface
{

    private const int PBKDF2IterCount = 1000; // default for Rfc2898DeriveBytes
    private const int PBKDF2SubkeyLength = 256 / 8; // 256 bits
    private const int SaltSize = 128 / 8; // 128 bits

    //[ComVisible(true)]
    public string HashPassword(string password)
    {
        if (password == null)
        {
            throw new ArgumentNullException("password cannot be null");
        }

        // Produce a version 0 (see comment above) text hash.
        byte[] salt;
        byte[] subkey;
        var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount);
            salt = deriveBytes.Salt;
            subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);


        var outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength];
        Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize);
        Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength);
        return Convert.ToBase64String(outputBytes);
    }



    // some other functions
}

}

在项目属性中选中“注册 COM 互操作”。 在 assemblyInfo.cs 中

[程序集:ComVisible(true)]

之后我用 regasm 注册了这个 dll

现在在 vb6 项目中,此 .tlb 可用作 PasswordHashLibrary2_0,我将其添加为参考。我的VB 6项目代码如下

Private Sub Form_Load()

Dim objHash As New PasswordHashLibrary2_0.Hash
Dim temp As String

temp = objHash.HashPassword("fsfds")

End Sub

当我运行这个程序时,你可以看到没有设置 objHash

在我前进这一行 vb6 给我错误

运行时错误'-2147024894 (80070002)':

自动化错误系统找不到指定的文件

【问题讨论】:

  • 勾选“Register for COM Interop”复选框足以开始测试代码。如果您使用 Regasm,那么运行正确的版本并使用正确的命令行参数很重要。 32 位和 /codebase /tlb。测试代码的最佳方法是使用 Project > Properties > Debug 并选择 vb6.exe 作为启动程序。现在您可以诊断运行时异常并设置断点。

标签: c# .net dll com vb6


【解决方案1】:

您可以使用gacutil 在 GAC(全局程序集缓存)中注册它,以确保 CLR 识别它:

gacutil /l PasswordHashLibrary2_0.dll

之后,使用regasm注册.NET DLL程序集时尝试使用codebase参数开关:

regasm [directory_path]\PasswordHashLibrary2_0.dll /codebase /tlb:[directory_path]\PasswordHashLibrary2_0.tlb

通常 CLR 在指向存储 VB 项目的同一目录之前在 GAC 中找到程序集名称,检查已存储在 GAC 和 TLB 文件中的 DLL 是否与执行这些步骤后的 DLL 位于同一位置。

【讨论】:

  • 嗨@Tetsuya我首先创建了一个强名称密钥对..然后尝试使用 gacutil -i "[dir path]/PasswordHashLibrary2.0.dll" 安装 dll 它现在说添加程序集以缓存失败模块应包含程序集清单
  • 我将程序集名称更改为 PasswordHashLibrary2.dll,然后生成 snk,然后使用 gacutil -i [程序集名称命令] 安装它现在显示“添加程序集失败...尝试在没有强项的情况下安装程序集名字”
  • 另一方面,如果我仍然抵抗这个 dll 并现在运行 vb6 应用程序上的错误是不同的运行时错误 91 对象变量或块变量未设置”而不是给出自动化错误
【解决方案2】:

嘿嘿,所以我发现了问题!

首先正如@Tetsuya 指出的 gacutil,所以我为 gacutil 添加了强名称,然后尝试安装给我错误的程序集

未能将程序集添加到缓存模块应包含程序集清单。

这意味着程序集已损坏,因此我将程序集名称更改为 PasswordHashLibrary2.dll 并重建项目。

然后注册这个程序集并添加引用。最后不知何故,在测试 New 关键字已从 vb6 代码中删除,因此我开始收到错误

运行时错误 91 对象变量或块变量未设置

所以修复了它,现在它可以工作了:)

干杯

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 2018-06-07
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多