アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

現在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側に渡したいだけです。

本当に困っています、なにとぞ宜しくお願い致します。

A 回答 (1件)

VBScriptでは変数に型がありません。

当然、構造体もありません。
Variant型で、形式が配列であるデータを返すようにしないと成功
しません。
また、要素が構造体なので、これ自体を別途、クラスとして登録
するか、文字列の配列として扱うようにする必要があります。
「VB用と同じ」と考えて設計したのであれば、全体の設計を見直す
ことを薦めます。

この回答への補足

お返事ありがとうございます!
こんなにも直ぐにご回答いただけるとは思っていませんでした。ありがとうございます。

>VBScriptでは変数に型がありません。当然、構造体もありません。
>Variant型で、形式が配列であるデータを返すようにしないと成功
>しません。

なるほど、、つまりObject配列を返して、その中にはプリミティブなデータ型しか入れることはできないという認識でよいのでしょうか?

>これ自体を別途、クラスとして登録
>するか、文字列の配列として扱うようにする必要があります。

文字列の配列にするのは最終手段と思っていたのですが、
別途クラスとして登録というのはC#とVBScriptどちらでクラスを作成するのでしょうか?

>「VB用と同じ」と考えて設計したのであれば、全体の設計を見直す
>ことを薦めます。

実験的にエクセルVBAで試していて、そちらで出来たのでVBScriptでも大丈夫だろうと楽観していました。
見直しをしようと思います、ありがとうございます。

補足日時:2009/10/15 16:16
    • good
    • 0
この回答へのお礼

度々すみません、解決しました!

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;
}
}


本当にありがとうございました。

お礼日時:2009/10/15 16:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!