お世話になります。
現在ClassicASPでWebアプリケーションを開発しているのですが、
その時にC#で作成したdllを使用したいと思い、
COM登録をしてASP側ではServer.CreateObjectで使用しようとしています。
しかし、データの受け渡し部分でずっとつまづいています。
やりたいことは、C#側の関数の戻り値で独自のクラス(構造体)の配列を戻したいのです。
以下サンプルコードです。
ASP側
<%@ Language=VBScript%>
<%
Response.ContentType = "text/html"
Dim testObject
set testObject = Server.CreateObject("TestObject")
list = testObject.getList()
Response.Write(TypeName(list))
' ここで、[VBScript でサポートされていないオートメーションが変数で使用されています]エラー
%>
C#側
[StructLayout(LayoutKind.Sequential)]
public struct TestData
{
[MarshalAs(UnmanagedType.BStr, SizeConst = 1024)]
public String title;
}
public interface ITestObject
{
TestData[] getList();
}
public class TestObject : ITestObject
{
public TestData[] getList()
{
TestData[2] result;
result[0].title = "1";
result[1].title = "2";
return result;
}
}
あとどういった処理が足りないのでしょうか?
やりたいことは、構造体配列をASP側に渡したいだけです。
本当に困っています、なにとぞ宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
VBScriptでは変数に型がありません。
当然、構造体もありません。Variant型で、形式が配列であるデータを返すようにしないと成功
しません。
また、要素が構造体なので、これ自体を別途、クラスとして登録
するか、文字列の配列として扱うようにする必要があります。
「VB用と同じ」と考えて設計したのであれば、全体の設計を見直す
ことを薦めます。
この回答への補足
お返事ありがとうございます!
こんなにも直ぐにご回答いただけるとは思っていませんでした。ありがとうございます。
>VBScriptでは変数に型がありません。当然、構造体もありません。
>Variant型で、形式が配列であるデータを返すようにしないと成功
>しません。
なるほど、、つまりObject配列を返して、その中にはプリミティブなデータ型しか入れることはできないという認識でよいのでしょうか?
>これ自体を別途、クラスとして登録
>するか、文字列の配列として扱うようにする必要があります。
文字列の配列にするのは最終手段と思っていたのですが、
別途クラスとして登録というのはC#とVBScriptどちらでクラスを作成するのでしょうか?
>「VB用と同じ」と考えて設計したのであれば、全体の設計を見直す
>ことを薦めます。
実験的にエクセルVBAで試していて、そちらで出来たのでVBScriptでも大丈夫だろうと楽観していました。
見直しをしようと思います、ありがとうございます。
度々すみません、解決しました!
C#側でObjectの配列を返すようにし、その中にClassにしたTestDataを入れるようにしたら無事ASP側で受け取ることが出来るようになりました。
Variant型しかないのでObject配列で受け取る必要があったのですね。
本当にありがとうございました。
以下解決コードです。
ASP側
<%@ Language=VBScript%>
<%
Response.ContentType = "text/html"
Dim testObject
set testObject = Server.CreateObject("TestObject")
list = testObject.getList()
Response.Write(TypeName(list))
%>
C#側
public class TestData
{
public String title;
}
public interface ITestObject
{
Object[] getList();
}
public class TestObject : ITestObject
{
public Object[] getList()
{
Object[] result = new Object[2];
TestData data;
TestData[0] = data = new TestData();
data.title = "1";
TestData[1] = data = new TestData();
data.title = "2";
return result;
}
}
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- PHP php エラー 2 2022/10/23 16:43
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
COBOLの基本的な事なので...
-
vba フィルター 複数条件 3つ以...
-
VB6からの移行したいけど、VB.N...
-
excel vbaの配列なんですが・・・
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
Dir関数で読み取り順を操作でき...
-
エクセルVBAからNotesでメー...
-
Redim とEraseの違いは?
-
VBA 桁数が混在するソート
-
コンボボックスのインデックス...
-
画像ファイルを配列に格納する方法
-
VB.NETにて、構造体へデータを...
-
構造体配列の特定のメンバーをF...
-
エクセルでXY座標に並べられた...
-
セル範囲から一次元配列の生成
-
デバイスマネージャーの一覧取得
-
エクセル(VBA)の空白配列の削除...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
定数配列の書き方
-
Excel2010のinputboxで複数デー...
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
Segmentation Fault (メモリ制限?)
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
COBOLの基本的な事なので...
-
Excelのメモリ(配列)の上限は2G...
-
コンボボックスのインデックス...
-
VB6のメモリ解放に関して
おすすめ情報