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

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

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

Re[8]: CSerializeObjectの例外対応の方法について


(過去ログ 110 を表示中)

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

■65314 / inTopicNo.1)  CSerializeObjectの例外対応の方法について
  
□投稿者/ howling (197回)-(2013/02/18(Mon) 11:56:21)

分類:[.NET 全般] 

いつもお世話になっております。

VS2010 / Windows7
C++/CLI,C#にて開発を行っております。

現在、C#側でXMLを使用しているのですが、
どうもSystem.Xml.Serialization.XmlSerializerで例外が発生しているらしく、困っております。

例外内容は次の通りです。
CPlusProject.exe の 0x7666c41f で初回の例外が発生しました: Microsoft C++ の例外: EEFileLoadException (メモリの場所 0x003ed5ac)。
CPlusProject.exe の 0x7666c41f で初回の例外が発生しました: Microsoft C++ の例外: EEFileLoadException (メモリの場所 0x003ed4ec)。

C#側ではForm1というクラスを定義し、LoadイベントでXMLの読み込み、ClosingイベントでXMLの書き込みを行っております。
C#側のプロジェクト名称はMultiProjectTestで、namespaceもこれに準じてMultiProjectTestとなっております。
C++/CLI側ではC#で作成したライブラリを読み込み、前述したForm1のShowを呼び出すのみです。
C++/CLI側をスタートアッププロジェクトに指定し、.exeファイルを出力しています。

念のためサンプルコードを作成しました。
C++側は、Win32プロジェクトで作成後、/clr指定を行い、
プロジェクト参照にMultiProjectTest(C#側のプロジェクト),System,System.Windows.Formsの3つを追加した状態にした後、

	gcroot<MultiProjectTest::Form1^> m_pForm1 = gcnew MultiProjectTest::Form1();

	if(static_cast<MultiProjectTest::Form1^>(m_pForm1) == nullptr){
		return -1;
	}

	m_pForm1->Show();

このコードのみ、_tWinMain関数に入れてあります。
C#側は次の通りです。
Windowsフォームアプリケーションでプロジェクト作成後、Form1を次のコードに書き換えてください。
コピペでいけるはずです。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace MultiProjectTest
{
    public partial class Form1 : Form
    {
        XMLData clsXMLData = null;
        string strFileName = "C:\\TestOutput.xml";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                if (File.Exists(strFileName) == true)
                {
                    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(XMLData));
                    //読み込むファイルを開く
                    System.IO.FileStream fileStream = new System.IO.FileStream(strFileName, System.IO.FileMode.Open);
                    //XMLファイルから読み込み、逆シリアル化する
                    clsXMLData = (XMLData)serializer.Deserialize(fileStream);
                    //ファイルを閉じる
                    fileStream.Close();
                }
            }
            catch (Exception excep)
            {
                MessageBox.Show(excep.Message, "読み込みエラー");
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (clsXMLData == null)
            {
                clsXMLData = new XMLData();
                clsXMLData.TestInt = 5;
                clsXMLData.TestString = "Tested";
            }

            try
            {
                //上位のフォルダが存在しない場合に作成する
                if (Directory.Exists(Path.GetDirectoryName(strFileName)) == false)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(strFileName));
                }
                System.Xml.Serialization.XmlSerializer clsSerializer = new System.Xml.Serialization.XmlSerializer(typeof(XMLData));
                //読み込むファイルを開く
                System.IO.FileStream clsFileStream = new System.IO.FileStream(strFileName, System.IO.FileMode.Create);
                clsSerializer.Serialize(clsFileStream, clsXMLData);
                //ファイルを閉じる
                clsFileStream.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "書き込みエラー");
            }
        }
    }

    //XMLでセーブ/ロードするクラス
    public class XMLData
    {
        public int TestInt
        {
            get;
            set;
        }

        public string TestString
        {
            get;
            set;
        }
    }
}


…と、以上で例外が出るのですが、
この対処方法をご存知の方はいらっしゃいますでしょうか?

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

引用返信 編集キー/
■65316 / inTopicNo.2)  Re[1]: CSerializeObjectの例外対応の方法について
□投稿者/ Azulean (100回)-(2013/02/18(Mon) 12:36:25)
確認ですが、何を問題視していますか?

単に出力ペインで初回例外と出るだけで止まるわけでも、異常な動作をするわけではないのであれば、気にしないことです。
.Net Frameworkの中で適切に処理されていることが大半だからです。

.Netの世界では例外を発生させてから適切に処理するパターンが多くなっていますので神経質に気にする必要はありません。
動作がおかしいとか、パフォーマンスで顕著に問題があるなら気にするぐらいです。


例外は多分、sgenしたアセンブリの読み込みにトライしてるのだと思いますが、何が何でも消さないといけない類ではないとは思います。
引用返信 編集キー/
■65317 / inTopicNo.3)  Re[1]: CSerializeObjectの例外対応の方法について
□投稿者/ shu (187回)-(2013/02/18(Mon) 12:37:30)
No65314 (howling さん) に返信

Exceptionで検索した以下のURL貼っておきます。
http://highgeometry.blog62.fc2.com/blog-entry-102.html
引用返信 編集キー/
■65318 / inTopicNo.4)  Re[2]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (198回)-(2013/02/18(Mon) 12:43:33)
No65316 (Azulean さん) に返信
お返事ありがとうございます。

実は、私のところでも問題なく動いているのですが、
他の方のPC上(同じくWindows7 / VS2010)で動作する際に、
どうもここで死んでしまうようなのです。
(WindowsXP上でも同じく死んでました)

で、今すぐ解決する必要性自体は無いのですが、
完成品の状態で同様の現象が起こった場合に困ってしまうので、
どうにかしたいと思っている所存です。

ですが、どちらかというとデバッグ環境の方に問題があるのでしょうか?
その部分はまだチェックしていませんので、確認する必要がありそうですね。うーん…。
引用返信 編集キー/
■65319 / inTopicNo.5)  Re[2]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (199回)-(2013/02/18(Mon) 12:47:54)
No65317 (shu さん) に返信
お返事ありがとうございます。

> Exceptionで検索した以下のURL貼っておきます。
> http://highgeometry.blog62.fc2.com/blog-entry-102.html

あー…原因がわかった気がします。
質問の環境にしっかり書いていないのがマズいのですが、
Windows7 の 64bitを使用しています。

この場合、Win32プロジェクト側は32bit用のDLLを読みたいのに、
C#側で指定されているDLLが64bit用のために起こっているのでしょうか…。
お教え頂いたURLにも書いてありますが、この例外だけ書かれても、あんまり特定できない物なんですね…。
とりあえずそこを主軸に考えてみたいと思います。
引用返信 編集キー/
■65356 / inTopicNo.6)  Re[3]: CSerializeObjectの例外対応の方法について
□投稿者/ Azulean (101回)-(2013/02/19(Tue) 22:03:25)
No65319 (howling さん) に返信
> Windows7 の 64bitを使用しています。
>
> この場合、Win32プロジェクト側は32bit用のDLLを読みたいのに、
> C#側で指定されているDLLが64bit用のために起こっているのでしょうか…。

C# プロジェクト側が AnyCPU か x86 であれば、Win32 構成の C++/CLI から呼び出した場合、32bit として動作しますので、推測されているような状況にはならなかったはずです。


// AnyCPU の場合は、exe がどちら側のプロセスになるかによって分岐する。
// アーキテクチャ違いの場合、BadImageFormatException になるので違うもののはず。
引用返信 編集キー/
■65364 / inTopicNo.7)  Re[4]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (202回)-(2013/02/20(Wed) 10:49:46)
No65356 (Azulean さん) に返信
> C# プロジェクト側が AnyCPU か x86 であれば、Win32 構成の C++/CLI から呼び出した場合、32bit として動作しますので、推測されているような状況にはならなかったはずです。
>
>
> // AnyCPU の場合は、exe がどちら側のプロセスになるかによって分岐する。
> // アーキテクチャ違いの場合、BadImageFormatException になるので違うもののはず。

一応確かめてみたところ、Any CPUになっていたので、おっしゃる通り目論見が外れていたようです。
うーん、とすると、何が原因なんだろう…。
引用返信 編集キー/
■65385 / inTopicNo.8)  Re[3]: CSerializeObjectの例外対応の方法について
□投稿者/ なかなか (1回)-(2013/02/21(Thu) 14:52:50)
2013/02/21(Thu) 15:05:53 編集(投稿者)

このexeやdllの配布はどのように行っていますか(どのようなインストーラーを使っていますか)

要はexeからdllがうまく呼び出されているかということなのですが、
変なリダイレクトがかかったりしていないかなと。
引用返信 編集キー/
■65387 / inTopicNo.9)  Re[4]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (204回)-(2013/02/21(Thu) 15:03:26)
No65385 (なかなか さん) に返信

まだexeを作っているだけで、配布自体は行っていないです。
また、このexe自体は社内での使用のみとなっているため、インストーラーも作らないのではないかと思います。
引用返信 編集キー/
■65388 / inTopicNo.10)  Re[5]: CSerializeObjectの例外対応の方法について
□投稿者/ なかなか (2回)-(2013/02/21(Thu) 15:07:25)
要はexeからdllがうまく呼び出されているかということが気になるのですが、
dll呼び出し時に変なリダイレクトがかかったりしていないのかなと。
引用返信 編集キー/
■65413 / inTopicNo.11)  Re[6]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (207回)-(2013/02/22(Fri) 10:38:55)
No65388 (なかなか さん) に返信
うーん、それってどう調べたら良いでしょうか?
実際うまくいっているかわかっていませんので、調べたいです。
引用返信 編集キー/
■65422 / inTopicNo.12)  Re[7]: CSerializeObjectの例外対応の方法について
□投稿者/ ダル (2回)-(2013/02/22(Fri) 14:58:31)
> どうもSystem.Xml.Serialization.XmlSerializerで例外が発生しているらしく、困っております。

System.Xml.Serialization.XmlSerializerで例外が発生しているらしい、という根拠があるのであれば、
C++の例外ではなく、C#の例外の内容を調べる必要があるのではないでしょうか。
引用返信 編集キー/
■65424 / inTopicNo.13)  Re[8]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (211回)-(2013/02/22(Fri) 17:38:19)
No65422 (ダル さん) に返信
> System.Xml.Serialization.XmlSerializerで例外が発生しているらしい、という根拠があるのであれば、
> C++の例外ではなく、C#の例外の内容を調べる必要があるのではないでしょうか。

はい、こちらはまったくその通りです。
ですので、実際に出ている部分はC#ですから、C#で出ている例外の内容を書いている次第です。

で、今回の例外の内容からして、例外を出す原因自体は複数考えられますね、という話で、
どれが原因になっているんだろう?というところで止まっている状態です。

また、そもそもこの例外は出ても全く問題なく動くもので、
むしろ止まるのがおかしい、というのが実際のところです。

この問題自体は、急ぎ解決しなければならないわけでもないため、かなり優先度も低いです。
そのこともあって、実はあれから例外で死ぬPC上で動作させる機会が無く、さっぱり確認作業ができていない状態だったりします。
また確認作業が行える状況になってからの回答となるため、一旦これはクローズした方が良いかもしれないですね。
一旦これは解決済みとしておきます。

//例外をエラーにするチェックとか入っているだけだったら良いんですが!
解決済み
引用返信 編集キー/
■65425 / inTopicNo.14)  Re[8]: CSerializeObjectの例外対応の方法について
□投稿者/ howling (212回)-(2013/02/22(Fri) 17:39:20)
No65422 (ダル さん) に返信
蛇足です。
もしかしてそのお名前って、シュタインズゲートが元だったりしますか?
ちょっと気になったもので。すみません^^;
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -