C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C#でDLLから構造体を取得するには


(過去ログ 83 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■49205 / inTopicNo.1)  C#でDLLから構造体を取得するには
  
□投稿者/ kinton (1回)-(2010/04/26(Mon) 23:33:04)

分類:[C#] 

こんにちは、いつもお世話になっております。

現在、C#で作成したDLLからメソッドを呼び出し、その戻り値の構造体を
受け取りたいと思っているのですが。(戻り値の構造体はObject型として受け取ります)
受け取り側でも同じ構造体を宣言し、キャストできないかと試しているのですが、なかなかうまくいきません。

調べた結果、構造体の宣言時に[StructLayout(LayoutKind.Sequential)]をつけるのは分かったのですが、

その後はどのようにすると構造体として受け取れるのでしょうか。
なかなか見つかりません。どなたかご教授いただけないでしょうか。
よろしくお願いいたします。


<環境>
WindowsXp
VisualStudio2005 C#
受け取り側もDLLもC#です。


引用返信 編集キー/
■49206 / inTopicNo.2)  Re[1]: C#でDLLから構造体を取得するには
□投稿者/ Hongliang (618回)-(2010/04/27(Tue) 00:16:37)
> 戻り値の構造体はObject型として受け取ります
なぜわざわざ Object 型で返すのでしょうか? 普通にちゃんとした型で返せばいいと思いますが。

> 受け取り側でも同じ構造体を宣言し、キャストできないかと試しているのですが、なかなかうまくいきません。
DLL 側で定義してる型を使います。参照してるんだから使えますよね? internal にしてる(またはアクセシビリティを特に指定していない)なら public にして下さい。
それとも DLL を参照設定して使ってはいないとか?

> 調べた結果、構造体の宣言時に[StructLayout(LayoutKind.Sequential)]をつけるのは分かったのですが、
これはアンマネージドな DLL とのやりとりの場合です。
C# を含むマネージドな DLL の場合は使いません。
引用返信 編集キー/
■49207 / inTopicNo.3)  Re[1]: C#でDLLから構造体を取得するには
□投稿者/ よねKEN (487回)-(2010/04/27(Tue) 00:18:25)
> 現在、C#で作成したDLLからメソッドを呼び出し、その戻り値の構造体を
> 受け取りたいと思っているのですが。(戻り値の構造体はObject型として受け取ります)
> 受け取り側でも同じ構造体を宣言し、キャストできないかと試しているのですが、なかなかうまくいきません。

そのメソッドはどのように呼び出しているのですか?
「C#で作成したDLL」のメソッドを呼び出せているということは参照設定しているのですよね?
参照設定しているなら、その構造体そのものが使えますので、
戻り値をObject型で受ける必要もありませんし、受け取り側で別の構造体を宣言する必要もありません。

> 調べた結果、構造体の宣言時に[StructLayout(LayoutKind.Sequential)]をつけるのは分かったのですが、

「C#で作成したDLL」という説明に間違いがなければ、StructLayout属性は今回は出番はありません。

引用返信 編集キー/
■49208 / inTopicNo.4)  Re[1]: C#でDLLから構造体を取得するには
□投稿者/ Jitta on the way (621回)-(2010/04/27(Tue) 07:09:22)
No49205 (kinton さん) に返信
> 受け取り側でも同じ構造体を宣言し、キャストできないかと試しているのですが、なかなかうまくいきません。

“同じ”構造体なら、キャスト出来ます。しかし、“同じ構造”をした別の構造体なら、キャスト出来ません。
CやC++で、どんな型にでもキャスト出来るのは、元の型を保持していないからです。C#では保持しているので、互換性がある型か、変換方法が明示されている型にしか、変換できません。

構造体をObjectにキャストすると、ボックス化が発生します。どの様な用途に使うのかわからないので明言出来ませんが、クラスを使う方が良いかもしれません。
引用返信 編集キー/
■49292 / inTopicNo.5)  Re[2]: C#でDLLから構造体を取得するには
□投稿者/ kinton (2回)-(2010/04/29(Thu) 09:01:47)
こんにちは、皆様ありがとうございます。
DLLですが、参照設定はしておりません。動的に呼び出しています。
以下のような場合構造体にキャストできるものでしょうか?

// DLLをロード
System.Reflection.Assembly myAsm = System.Reflection.Assembly.LoadFrom("Test.dll");
obj = myAsm.CreateInstance("TestClass");
type = obj.GetType();
System.Reflection.MethodInfo mi = type.GetMethod("Method");
// 実行
Object Ret = mi.Invoke(obj, new Object[]{1,2})            
// Ret が構造体です。

引用返信 編集キー/
■49303 / inTopicNo.6)  Re[3]: C#でDLLから構造体を取得するには
□投稿者/ Hongliang (619回)-(2010/04/29(Thu) 12:44:02)
2010/04/29(Thu) 12:44:53 編集(投稿者)
> 以下のような場合構造体にキャストできるものでしょうか?
無理ですね。
// その構造体が .NET の標準ライブラリの物である場合を除く。
XmlSerializer で無理矢理とかも考えられますが……。

実行ファイルと実行時にロードする DLL の両方から参照される、もう一つの DLL を作成します。
この DLL に、受け渡しする型を定義して下さい。
もっというと、この DLL に、実行時ロードするクラスの基底クラスまたはインターフェイスを定義するのが普通です。

// main.exe  reference.dllを参照
Assembly assem = Assembly.Load("test");
Type type = assem.GetType("Test");
ITest test = (ITest)Activator.CreateInstance(type);
Data data = test.Do();

// reference.dll
public interface ITest {
    Data Do();
}
public class Data {
    public string Name { get { return this.name; } }
    private string name;
    public Data(string name) { this.name = name; }
}

// test.dll  reference.dllを参照
public class Test : ITest {
    public Data Do() {
        return new Data("test");
    }
}

引用返信 編集キー/
■49311 / inTopicNo.7)  Re[4]: C#でDLLから構造体を取得するには
□投稿者/ kinton (3回)-(2010/04/29(Thu) 19:54:45)
なるほど、参考になりました!
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -