我已经创建了一个类库DLL并将其包装起来,但是当我在VBA(Excel)中使用它时它没有方法。一切都来自另一个.NET程序:
这是我的代码:
namespace NeilLibrary
{
public interface INeilTest
{
string DoMethodReturn(string name);
string DoMethodOut(string name, out string name2, out bool isPrev);
}
[Guid("BA7CC0F2-9C07-4EF9-B799-18D317B7E293")]
[ComVisible(true)]
public class NeilTest
{
public NeilTest() { }
[ComVisible(true)]
public string DoMethodReturn(string name)
{
return "name: " + name;
}
[ComVisible(true)]
public string DoMethodOut(string name, out string name2, out bool isPrev)
{
name2 = "New Value";
isPrev = true;
return "Name: " + name;
}
} }
我在程序集中启用了COM的情况下构建它,然后运行以下命令:
regasm.exe NeilLibrary.dll /tlb:neil.tlb
哪个工作正常。在Excel中,我导入了tlb,它出现在对象浏览器中,所以创建好了,但是没有方法。然而,使用它的方法显示了界面,但这并没有多大用处。
请有人帮忙。
我添加了no-arg构造函数,因为我在某处遇到类似问题的人必须这样做。
答案 0 :(得分:1)
哦,我发现差异就是你发布了你的代码......
您需要创建要使用COM Visible的函数。您可以在属性文件中或您上面的类别
中执行此操作[ComVisible(true)]
[Guid("blah")]
public class ConnectionUtilities: IConnectionUtilities
{
}
通过进入C#项目的属性 - > AssemblyInfo.cs并声明如下所示,尝试使整个程序集变得可见:
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0a2d43c9-da5e-4a59-8006-ff131b33d86c")]
答案 1 :(得分:1)
首先,感谢大家的帮助。
最终解决方案相当简单。我只需要在regasm.exe中添加'/ codebase'(或签名并通过gacutil添加它)。
另外,我没有检查任何其他排列,但这是它对我有用的唯一方式:
text/plain