83870


C#でExcel VBAからアクセスするようのDLLを作りました。

[code]

    [Guid("6905A3B9-E09A-492A-9EC8-2A558814F778")]
    public class Test
    {
        public Item[] Items { get; set; }
        public Test() { Items = new Item[0]; }
    
        public void GetItems(out Item[] items)
        {
            items = new Item[2];
            Items[0] = new Item() { ID = 1, Name = "A" };
            Items[1] = new Item() { ID = 2, Name = "B" };
        }
    }
    public class Item
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    
[/code]

このdllに対して、GetItems()のout引数であるitemsをVBA側で取得したいです。  
app.GetItemsのout変数部分をどのように書けばよいか...

[code]

     Public Sub Test()
     Dim app As Object
     Set app = CreateObject("Test")
     'ここをどうやって書けばよいか... > app.GetItems(out変数を取得したい)
    
     End Sub
    
[/code]

dllはCOM用にビルドされており、VBA側で参照設定できる or
CreateObject()でオブジェクトが作成はできています。すごく初歩的な質問でしたらすみません。  
ご教授お願いします。


CC BY-SA 4.0
2021-11-29T13:04:53.740
83869
2021-11-29T13:37:02.913
12388
question
c# vba com
C#で作ったCOM dll内の配列にはどのようにアクセスすればよいか


[`UnmanagedType.SafeArray`の例](https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.interopservices.unmanagedtype?view=net-6.0#examples)を読む限り

>
[code]

>     public void GetItems(out Item[] items)
>  
[/code]

この部分を

[code]

    public void GetItems([In, Out, MarshalAs(UnmanagedType.SafeArray)] ref Item[] items)
    
[/code]

と書くことでVBA側は

[code]

    Dim items As Item()
    app.GetItems(items)
    
[/code]

と書けるかもしれません。

なお試してません。他の部分でエラーになるかもですし、メソッド引数で配列を受け取る形はあまり見かけない気がします。


CC BY-SA 4.0
2021-11-29T13:37:02.913
83870
2021-11-29T13:37:02.913
4236
83869
answer