■前提・実現したいこと
ExcelVBAからC#で作成したDLLのメソッドに配列を渡したいです。
■発生している問題・エラーメッセージ
ExcelVBAを実行すると以下のメッセージが出ます。(以下VBAコードの★の行)
コンパイルエラー
関数またはインターフェースが予約されているか、またはVisual Basicでサポートされていないオートメーションタイプが関数で使用されています。
■該当のソースコード
VBA
1Sub test() 2 Dim obj As MyComLibMain 3 Dim ret As String 4 Dim arg As MyComLibArg 5 6 Dim strArray(2) As String 7 8 strArray(0) = "111" 9 strArray(1) = "222" 10 strArray(2) = "333" 11 12 Set arg = New MyComLibArg 13 arg.myBool = True 14 arg.myInt = 123 15 arg.myString = "hoge" 16 arg.myStrArray = strArray ★ここでエラーが起きる 17 18 Set obj = New MyComLibMain 19 20 ret = obj.StructArgsFunc(arg) 21 22 MsgBox ret 23End Sub
C#
1using System; 2using System.Runtime.InteropServices; 3 4namespace MyComLib 5{ 6 [ComVisible(true)] 7 [InterfaceType(ComInterfaceType.InterfaceIsDual)] 8 public interface IMyComLibMain 9 { 10 string StructArgsFunc(object obj); 11 } 12 13 [ComVisible(true)] 14 [InterfaceType(ComInterfaceType.InterfaceIsDual)] 15 public interface IMyComLibArg 16 { 17 int myInt { get; set; } 18 string myString { get; set; } 19 bool myBool { get; set; } 20 string[] myStrArray { get; set; } 21 } 22 23 [ClassInterface(ClassInterfaceType.None)] 24 public class MyComLibArg : IMyComLibArg 25 { 26 public int myInt { get; set; } 27 public string myString { get; set; } 28 public bool myBool { get; set; } 29 public string[] myStrArray { get; set; } 30 } 31 32 [ClassInterface(ClassInterfaceType.None)] 33 public class MyComLibMain : IMyComLibMain 34 { 35 public string StructArgsFunc(object arg) 36 { 37 try 38 { 39 if (arg == null) 40 { 41 return "arg is null."; 42 } 43 44 if (!(arg is MyComLibArg)) 45 { 46 return "arg is not MyComLibArg type."; 47 } 48 49 var obj = arg as MyComLibArg; 50 51 var primitiveArg = $"obj.myInt={obj.myInt}\nmyString={obj.myString}\nmyBool={obj.myBool}"; 52 var arrays = ""; 53 54 foreach(var s in obj.myStrArray) 55 { 56 arrays += s; 57 } 58 59 return $"success! ({primitiveArg}, {arrays}"; 60 61 } 62 catch (Exception ex) 63 { 64 return ex.Message; 65 } 66 } 67 } 68}
■自分で調べたことや試したこと
・配列以外の型(int, bool, string)については渡せています。
・Dim strArray(2) As Stringを、「As Variant」や「As Object」に変えてもダメでした。
■使っているツールのバージョンなど補足情報
- 開発環境:VisualStudio2022
- Excel:64bit
<プロジェクトの情報>
・「アセンブリをCOM参照にする」:ON
・対象プラットフォーム:x64
・アセンブリに署名する:あり
<REGASMの情報>
・登録時
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm /tlb /codebase /v MyComLib.dll
どうかよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/04 07:57