|
分類:[.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;
}
}
}
…と、以上で例外が出るのですが、
この対処方法をご存知の方はいらっしゃいますでしょうか?
以上
宜しくお願い致します。
|