在VB6应用程序中使用.NET dll需要注册

7

我有一个用C#编写的DLL,我想在我的VB6应用程序中使用它。

在VS2008中,项目属性“注册COM互操作”已被选中,并且当我编译DLL并尝试在开发机器上使用它时,它可以正常运行。

我需要在没有安装VS2008的计算机上运行它,因此我尝试这样注册这个DLL:

C:\WINDOWS\system32>..\Microsoft.NET\Framework\v2.0.50727\regasm myDLL.dll /tlb: myDLL.tlb /codebase

但是当我尝试运行它时,出现了以下错误:

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

有人能告诉我我做错了什么吗?


你在注册后移动了它吗?文件在机器上肯定可用吗? - Jeff
请参考这里:https://dev59.com/BnNA5IYBdhLWcg3wpfmu - Jeff
在Windows Vista/7上,您需要使用提升的权限运行RegAsm,方法是以管理员身份运行命令提示符。 - Matt Wilko
你有找到答案吗? - Christopher Chase
2个回答

4
就像你指定了regasm.exe的完整路径一样,你需要指定你的.dll文件的完整路径;-)

我正在从我的dll路径运行regasm。 - La La La
@ La La La:你试过我的建议了吗? - Dabblernl

1
这种情况发生的原因是因为您没有为类分配GUID。在.NET中,您的类应该像这样进行装饰:
[GuidAttribute("BA713700-522D-466e-8DD4-225884504678")]
public class MyClass

这样,每次运行regasm时,您的类都将使用相同的GUID属性进行编译。如果不包括此属性,则regasm将自动分配不同的GUID。

为了完全安全,您的类必须从一个接口继承。

[Guid("9AC71CA7-6F82-44A3-9ABE-75354B514A46")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IManager
{
    [DispId(1)]
    void Display(ADODB.Recordset recordSet);
    [DispId(2)]
    void Close();
}

[Guid("B9BB5B84-8FBD-4095-B846-EC072163ECD3")]
[ClassInterface(ClassInterfaceType.None)]    
[ProgId("This.Is.GonnaBe.MyClass")]    
public class Manager : IManager
{ 
    public void Display(ADODB.Recordset recordset)
    {
        // do stuff
    }
    public void Close()
    {
        // do stuff
    }
}

顺便提一下,我是用“CreateObject”创建实例的。 - La La La
使用CreateObject,我不知道 - 没有真正的经验。但是如果您选择进行早期绑定,过程如下:当您针对lib编译主应用程序时,它使用现有的lib GUID 来访问它。在其他PC上,您正在执行regasm,这会生成新的GUID,但您不会编译主应用程序,对吧?尝试这个实验。编译您的主应用程序。转到注册表并删除与您的lib相关联的任何GUID,重新运行regasm,然后启动主应用程序(无需重新编译)。我猜它不会起作用。 - AngryHacker
据我所知,使用CreateObject时,Interop/COM使用不同的接口访问库,这就是为什么你可能会面临挑战的原因。但我对此了解不够。 - AngryHacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接