在excelvba中使用C#库函数
我的C#库(.net 4.5.2)代码如下所示:在excelvba中使用C#库函数,c#,vba,excel,C#,Vba,Excel,我的C#库(.net 4.5.2)代码如下所示: namespace HelloWorld { public class Hello { public string HelloUser(string name) { return "Hello, " + name; } } } 我已使用以下代码使程序集COM在AssemblyInfo.cs文件中可见: [assembly: ComVisible(tr
namespace HelloWorld
{
public class Hello
{
public string HelloUser(string name)
{
return "Hello, " + name;
}
}
}
我已使用以下代码使程序集COM在AssemblyInfo.cs文件中可见:
[assembly: ComVisible(true)]
我通过工具->引用在VBA代码中添加了对dll的引用,当尝试在excel VBA中使用相同的引用时,我得到运行时错误:429(ActiveX组件无法创建对象)。我的代码/呼叫有什么问题:
Excel VBA(2013)
更新
通过Toos->References添加引用并使用F2检查状态后
更新#3
更新了VBA代码,但仍然没有成功。这次错误是:
Run-time error: 429 (ActiveX component can't create object)
您的类不向COM公开任何接口。如果希望能够在后期绑定中使用它,则需要使用
[Guid(“some Guid”)]
属性装饰类,并为其提供[ProgId(“some.Id”)]
,以及正式描述成员公开方式的[ComDefaultInterface(typeof(IHelloWorld))]
:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IHelloWorld
{
string HelloUser(string name);
}
[ComVisible(true)]
[ComDefaultInterface(typeof(IHelloWorld))]
public class HelloWorld : IHelloWorld
{
public string HelloUser(string name)
{
return $"Hello, {name}.";
}
}
您的类不向COM公开任何接口。如果希望能够在后期绑定中使用它,则需要使用
[Guid(“some Guid”)]
属性装饰类,并为其提供[ProgId(“some.Id”)]
,以及正式描述成员公开方式的[ComDefaultInterface(typeof(IHelloWorld))]
:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IHelloWorld
{
string HelloUser(string name);
}
[ComVisible(true)]
[ComDefaultInterface(typeof(IHelloWorld))]
public class HelloWorld : IHelloWorld
{
public string HelloUser(string name)
{
return $"Hello, {name}.";
}
}
从VBA项目中引用类型库(.tlb),将其用作VBA中的任何其他类型库。不过,我不确定这对COM有多友好,你可能想用适当的属性来修饰
Hello
类。@Mat'smugh我简化了dll的代码,使之成为非静态的。我怀疑我没有在VBA中正确声明函数。这是在类(Hello)和命名空间(HelloWorld)中声明函数的正确方法吗?您不必声明它,而是使用工具>引用。。。然后浏览以找到类型库,并将其添加为引用。然后点击F2进入VBE的对象浏览器,查看是否加载了HelloWorld
库,以及它是否包含带有HelloUser
函数的Hello
类。如果没有,你就有问题了。如果是这样,那么您可以在VBA中像在任何其他引用的类型库中一样使用它。@Mat'sMug我使用了建议的方法添加了它,现在我看到了dll和类,但在类下面什么都没有(Hello)。从VBA项目中引用类型库(.tlb),就像在VBA中使用任何其他类型库一样使用它。不过,我不确定这对COM有多友好,你可能想用适当的属性来修饰Hello
类。@Mat'smugh我简化了dll的代码,使之成为非静态的。我怀疑我没有在VBA中正确声明函数。这是在类(Hello)和命名空间(HelloWorld)中声明函数的正确方法吗?您不必声明它,而是使用工具>引用。。。然后浏览以找到类型库,并将其添加为引用。然后点击F2进入VBE的对象浏览器,查看是否加载了HelloWorld
库,以及它是否包含带有HelloUser
函数的Hello
类。如果没有,你就有问题了。如果是这样,那么您在VBA中使用它就像在任何其他引用的类型库中一样。@Mat'sMug我使用建议的方法添加了它,现在我看到了dll和类,但在类下面什么都没有(Hello)。我假设这是一个普通的库项目,而不是任何特殊的office模板,对吗?我需要使用剪贴板,这似乎是一个不需要摆弄系统API的简单方法。还建议选择任何特定的.net框架来减少潜在的兼容性问题?@t3chb0t理论上最新的.net核心具有完整的COM互操作支持(对吗?),但我还没有测试过它。但是是的,这只是一个标准的图书馆项目;你需要注意主机应用程序的比特率,因为它将引用库;可能需要单独的x86和x64版本。走开!我刚刚尝试过,结果证明这需要将lib注册为管理员。他们不会允许我这么做的,呵呵,回到系统API:-]新想法。。。也许我可以创建一个加载项并从VBA调用它。正在研究…@t3chb0t如果您在系统级注册COM内容,则只需要管理员权限;Rubberduck的安装程序允许每个用户通过注册HKCU(如果我记得的话,HKCU需要所有手动创建的密钥)进行无私密安装。我想这将是一个普通的图书馆项目,而不是任何特殊的office模板,对吗?我需要使用剪贴板,这似乎是一个不需要摆弄系统API的简单方法。还建议选择任何特定的.net框架来减少潜在的兼容性问题?@t3chb0t理论上最新的.net核心具有完整的COM互操作支持(对吗?),但我还没有测试过它。但是是的,这只是一个标准的图书馆项目;你需要注意主机应用程序的比特率,因为它将引用库;可能需要单独的x86和x64版本。走开!我刚刚尝试过,结果证明这需要将lib注册为管理员。他们不会允许我这么做的,呵呵,回到系统API:-]新想法。。。也许我可以创建一个加载项并从VBA调用它。正在研究…@t3chb0t如果您在系统级注册COM内容,则只需要管理员权限;Rubberduck的安装程序允许每个用户通过注册HKCU进行无私密安装(如果我记得的话,HKCU需要手动创建所有密钥)