我用这个简单的类创建了一个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
行上引发异常自动化错误。
它几乎不比这简单......错误在哪里?!
答案 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
只需在此给出答案,因为这可能会阻止其他编码人员在此浪费时间。