实例化.Net COM可见类时的自动化错误

时间:2011-08-28 22:01:08

标签: .net vb6 com-interop

我用这个简单的类创建了一个COM-interop .dll:

using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    [ComVisible(true)]
    [Guid("795ECFD8-20BB-4C34-A7BE-DF268AAD3955")]
    public interface IComWeightedScore
    {
        int Score { get; set; }
        int Weight { get; set; }
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("9E62446D-207D-4653-B60B-E624EFA85ED5")]
public class ComWeightedScore : IComWeightedScore
{

    private int _score;

    public int Score
    {
        get { return _score; }
        set { _score = value; }
    }
    private int _weight;

    public int Weight
    {
        get { return _weight; }
        set { _weight = value; }
    }

    public ComWeightedScore()
    {
        _score = 0;
        _weight = 1;
    }
  }

} 我使用以下方式注册: C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ regasm C:\ ComClasses \ Classlibrary1.dll / tlb:Classlibrary1.tlb

最后,我成功地添加了对.dll的引用,之后VB6给了我对该对象的智能感知。

Private Sub Form_Load()
    Dim score1 As ComWeightedScore

    Set score1 = New ComWeightedScore
    score1.Score = 500

End Sub

Set score1=new ComWeightedScore行上引发异常自动化错误。

它几乎不比这简单......错误在哪里?!

3 个答案:

答案 0 :(得分:8)

您忘记了Regasm.exe命令行中的/ codebase选项。

没有它,你必须强化程序集并将其放入GAC中并使用gacutil.exe。客户端机器上的好主意,只是不在你的机器上。

答案 1 :(得分:3)

如果您运行的是64位处理器,并且项目编译为“CPU-Any”,则您需要仅针对x86进行编译或在64位COM +空间中注册dll。

32和64位regasm的例子:

%windir%\ Microsoft.NET \ Framework \ v4.0.30319 \ regasm“Contoso.Interop.dll”/tlb:Contoso.Interop.tlb / codebase Contoso.Interop

%windir%\ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm“Contoso.Interop.dll”/tlb:Contoso.Interop.tlb / codebase Contoso.Interop

答案 2 :(得分:1)

当我运行生成的EXE时,我也遇到了类似的问题,因为我将dll的本地副本放到了VB6项目目录中(以前是出于测试目的)。

以调试模式(F5)运行项目很好,但是EXE加载了本地dll,而不是获取注册的TLB。

下面的此类代码,引用了崩溃的接口:

Dim sf As StuffUtils.IStuffer
Set sf = New StuffUtils.Stuffer

只需在此给出答案,因为这可能会阻止其他编码人员在此浪费时间。