如何在VBA中使用.NET类?语法帮助!

时间:2010-04-01 12:33:09

标签: .net vba com instantiation

好的我有几个我想在VBA中使用的.NET类。所以我必须通过COM注册它们。我想我已经找到了COM注册(最后),但现在我需要有关如何创建对象的语法的帮助。这是一些伪代码,显示了我想要做的事情。

编辑:更改了附加对象以返回ArrayList而不是List

.NET类看起来像这样......

public class ResourceManagment
{
    public ResourceManagment()
    {
        // Default Constructor
    }

    public static List<RandomObject> AttachedObjects()
    {
        ArrayList list = new ArrayList();
        return list;
    }
}

public class RandomObject
{
    // 
    public RandomObject(int someParam)
    {

    }

}

好的,这就是我想在VBA中做的事情(用C#演示),但我不知道怎么做......

public class VBAClass
{
    public void main()
    {
        ArrayList myList = ResourceManagment.AttachedObjects();
        foreach(RandomObject x in myList)
        {
            // Do something with RandomObject x like list them in a Combobox
        }
    }
}

需要注意的一点是RandomObject没有公共默认构造函数。所以我不能像Dim x As New RandomObject那样创建它的实例。 MSDN说你不能通过COM实例化一个没有默认构造函数的对象,但如果它被另一个方法返回,你仍然可以使用该对象类型... Types must have a public default constructor to be instantiated through COM. Managed, public types are visible to COM. However, without a public default constructor (a constructor without arguments), COM clients cannot create an instance of the type. COM clients can still use the type if the type is instantiated in another way and the instance is returned to the COM client. You may include overloaded constructors that accept varying arguments for these types. However, constructors that accept arguments may only be called from managed (.NET) code. < / p>

补充:这是我在VB中的尝试:

Dim count As Integer
count = 0
Dim myObj As New ResourceManagment
For Each RandomObject In myObj.AttachedObjects
    count = count + 1
Next RandomObject

2 个答案:

答案 0 :(得分:1)

要解决此问题,您需要在.net代码中创建RandomObjectFactory并创建要在VBA中使用的RandomObject实例

这样的事情:

public class RandomObjectFactory
{
     public static Create(int someParam)
     {
          return new RandomObject(someParam);
     } 
}

您可以扩展此类以获得更多的create方法重载,以创建RandomObjects的不同重载

更新:

基于对this questionthis one问题的正确理解,可能会有用

答案 1 :(得分:1)

您的问题是AttachedObjects()方法是静态的。 COM无法做静态方法。在COM中,您可以执行的唯一“静态”操作是“实例化一个类”。

因此,为了从VBA调用AttachedObjects方法,只需将其设置为非静态(即删除其定义中的static关键字)。除此之外,该方法可以保持与现在完全一样。您的VBA代码似乎也可以 - 修改方法后应该可以正常工作。

如果它不起作用,下一个问题是:你准确得到什么错误,在什么时候?