实例化一个 .Net COM 可见类时出现自动化错误

7

我使用这个简单的类创建了一个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 中抛出了自动化错误异常。

这似乎再简单不过了...错误在哪里呢?!


你为什么说错误在于分配int或long?失败的是构造函数调用。如果您从构造函数体中删除分配,它是否仍然失败?此外,请提供有关您收到的错误的更多信息和详细信息。 - Davide Piras
3个回答

10
您在Regasm.exe命令行中忘记了/codebase选项。
没有该选项,您需要使用gacutil.exe强名称程序集并将其放入GAC。这是客户端机器上的好主意,但不适用于您的机器。

4
如果您正在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

1
当我运行生成的EXE文件时,也遇到了类似的问题,因为我在VB6项目目录中放置了dll的本地副本(之前是为了测试目的)。在调试模式下运行项目(F5)没有问题,但EXE加载了本地的dll而不是获取已注册的TLB。下面的代码引用接口导致崩溃:
Dim sf As StuffUtils.IStuffer
Set sf = New StuffUtils.Stuffer

我在这里留下这个答案,因为它可能会防止其他编码人员浪费时间。


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