我正在试图弄清楚如何解决这个问题。我尝试了许多我在互联网上看到但却没有成功的东西。我试过:使用regasm,编译目标为x86,dumpbin dll /t:dll.tlb,更改Framework等版本。
我有两台机器(M1和M2)都带有Windows 7 64和VS2012。当我在M1中开发COM时,它在M1的VBA中运行良好。但它不适用于M2(错误429)。然后,如果我去M2并写一个新的COM,它在M2的VBA中工作正常,但不适用于M1。
似乎VS2012正在执行一个我看不到的“隐藏”注册步骤。有人知道如何找到它吗?
非常感谢!下面是我的“COM Hello World”。我也在使用Register for COM interop。
更新:
如果我跑:
C:\windows\Microsoft.NET\Framework\v4.0.30319\regasm TesteLib.dll /TesteLib.tlb
429错误消失了。但现在,而不是错误429,我在同一行中收到“错误-2147024894(80070002)自动化错误”。
我按照Can't instantiate a COM object written in C# from VBA (VB6 ok)的解决方案在EXCEL.exe文件夹中创建一个Excel.Exe.Config,我的程序运行正常。但我认为我无法在客户端计算机上执行此操作。有替代方案吗?
此外,它在VB6中正常工作(无需执行REGASM)。
.net方
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace TesteLib
{
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("c6b093c6-f568-4962-8955-795fc14f34bb")]
[ComVisible(true)]
public interface ClassInt1
{
int sum(int a, int b);
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("19ff9b41-8652-4012-ac55-c1a1d8f18cbb")]
[ComVisible(true)]
[ProgId("TesteLib.Class1")]
public class Class1 : COMException, ClassInt1
{
public int sum(int a, int b)
{
return a + b;
}
}
}
VBA方
Sub t()
Dim r As TesteLib.Class1
Set r = New TesteLib.Class1 'Run-time error '429': ActiveX component can't create object
MsgBox r.Sum(35, 51)
End Sub
答案 0 :(得分:3)
现在它正在运作!
我需要使用带有选项/ codebase
的REGASM注册DLLC:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /codebase TesteLib.dll
当我包含选项/ codebase时,它会生成一个警告,但它可以工作:RegAsm警告:使用/ codebase注册一个未签名的程序集会导致程序集干扰可能安装在同一台计算机上的其他应用程序。 / codebase开关仅用于签名程序集。请给你的程序集一个强名称并重新注册。
然后,在VS2012中,我标记了选项Project Properties>签名>签署组件>新...并运行REGASM。警告逐渐消失,现在一切似乎都很好:)。
谢谢!