Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在excelvba中使用C#库函数_C#_Vba_Excel - Fatal编程技术网

在excelvba中使用C#库函数

在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

我的C#库(.net 4.5.2)代码如下所示:

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需要手动创建所有密钥)