質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1079閲覧

C#で作ったCOMオブジェクトの関数の戻り値にクラスの配列を含めたい

h-satou

総合スコア6

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/08/18 09:12

編集2017/08/21 04:19

C#でCOMオブジェクト(DLL)を作ってます。

###発生している問題
関数の戻り値としてクラスを返したいのですが、クラスの配列を含めたクラスを戻り値にすると、受け取り側(VB6)のアプリがコンパイルできません。

###エラーメッセージ(VB6)

コンパイル エラー: 引数の数が一致していません。または不正なプロパティを指定しています。

###問題のコード

lang

1using System.Runtime.InteropServices; 2 3namespace COMTest 4{ 5 [ComVisible(true)] 6 [ClassInterface(ClassInterfaceType.AutoDual)] 7 public class InnerClass 8 { 9 public int InnerID; 10 public string Name; 11 } 12 13 [ComVisible(true)] 14 [ClassInterface(ClassInterfaceType.AutoDual)] 15 public class ClassA 16 { 17 public int ID; 18 public InnerClass[] AAA; 19 } 20 21 [ComVisible(true)] 22 [InterfaceType(ComInterfaceType.InterfaceIsDual)] 23 public interface ITest 24 { 25 ClassA VBGetClassA(); 26 } 27 28 [ClassInterface(ClassInterfaceType.None)] 29 public class FromVB6:ITest 30 { 31 public ClassA VBGetClassA() 32 { 33 ClassA a = new ClassA(); 34 a.ID = 1; 35 a.AAA = new InnerClass[2]; 36 a.AAA[0] = new InnerClass(); 37 a.AAA[0].InnerID = 1; 38 a.AAA[0].Name = @"ClassA-InnerClass1"; 39 a.AAA[1] = new InnerClass(); 40 a.AAA[1].InnerID = 2; 41 a.AAA[1].Name = @"ClassA-InnerClass2"; 42 return a; 43 } 44 } 45}

lang

1VB6 2Private Sub Command1_Click() 3Dim x As COMTest.FromVB6 4Dim a As ClassA 5 6 Set x = New COMTest.FromVB6 7 Set a = x.VBGetClassA() 8 Debug.Print a.ID 9 Debug.Print a.AAA(0).InnerID ' ここでエラーが発生します(AAA(0)が選択される)。 10 Debug.Print a.AAA(0).Name 11 Debug.Print a.AAA(1).InnerID 12 Debug.Print a.AAA(1).Name

###試したこと
AAAを配列にしなければ問題なく動きました。そのときのコードは以下の通りです。

lang

1 ~略~ 2 public class ClassA 3 { 4 public int ID; 5 public InnerClass AAA; 6 } 7 ~略~ 8 public ClassA VBGetClassA() 9 { 10 ClassA a = new ClassA(); 11 a.ID = 1; 12 a.AAA = new InnerClass(); 13 a.AAA.InnerID = 1; 14 a.AAA.Name = @"ClassA-InnerClass1"; 15 return a; 16 } 17 ~略~

lang

1VB6 2Private Sub Command1_Click() 3Dim x As COMTest.FromVB6 4Dim a As ClassA 5 6 Set x = New COMTest.FromVB6 7 Set a = x.VBGetClassA() 8 Debug.Print a.ID 9 Debug.Print a.AAA.InnerID 10 Debug.Print a.AAA.Name 11

###補足情報
VB6のウォッチウインドウで戻り値の中を見ると、配列にしたクラスの中身は問題なく格納されていました。

開発環境は、
Windows7 Professional(SP1)
Microsoft Visual Studio Community 2015
.Net Framework 4.6
Visual C# 2015
VB6(SP6)
です。

以上、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

VB6側でAAAをVariant型の変数に代入することで値を参照することができました。

lang

1Private Sub Command1_Click() 2Dim x As COMTest.FromVB6 3Dim a As ClassA 4Dim c 5Dim i As Integer 6 7 Set x = New COMTest.FromVB6 8 Set a = x.VBGetClassA() 9 Debug.Print a.ID 10 c = a.AAA 11 For i = 0 To UBound(c) 12 Debug.Print c(i).InnerID 13 Debug.Print c(i).Name 14 Next i 15 Set c = Nothing 16 Set a = Nothing 17 Set x = Nothing 18End Sub

投稿2017/08/21 04:56

h-satou

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問