トップ回答者
.exeが作成される場所と同じ場所に.dllを配置してもエラーが出る。

質問
-
バージョン:Visual Studio 2013
言語:C#
.Net Framework 4.5.1
開発環境:Windows 7 Home (64bit)(iOSにParallels DesktopでWindows7を入れています。)
配布環境:Windows 7 Home (64bit)
MacのXamarinで作成したGtk2.0プロジェクトプログラムをVisual Studioで実行しようとしています。
Gtkをダウンロードし、参照設定も問題ないはずなのですが、
型 'System.DllNotFoundException' のハンドルされていない例外が glib-sharp.dll で発生しました
追加情報:DLL 'libglib-2.0-0.dll' を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E)のエラーがでてしまい、実行できません。
なお、個人的に解決策をしらべ、
①環境変数を
C:\Program Files (x86)\GtkSharp\2.12\→C:\Program Files (x86)\GtkSharp\2.12\bin
に変更(もともとはC:\Program Files (x86)\GtkSharp\2.12\でした)
.exeの作成されるファイルにlibglib-2.0-0.dllをコピー
したのですが、やはり同様のエラーがでてしまいます。
どうしたら良いでしょうか
ご回答宜しくお願いします。
回答
-
Gtk とか libglib-2.0-0.dll など全く知識がないのでハズレかもしれませんが・・・
質問者さんが作成したプログラムが Any CPU または x64 でコンパイルされていて、libglib-2.0-0.dll が 32-bit 版しかない場合、64-bit OS 上では動かないのですが、そういう問題ではないのでしょうか?
何故動かないかの説明、32/64-bit どちらで dll が作られているかを調べる方法、どのように解決したらいいかなどは以下のページが参考になると思います。
Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspxPart 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspxハズレでしたら失礼しました。
-
string.Formatでファイル名を作っていますが、残念ながらWindowsではファイル名に半角スラッシュ(/)と半角コロン(:)は使えません。
別の文字か全角などで代用しましょう。System.IO.Path.GetInvalidPathChars()で実行環境のパスで仕様できない文字の一覧が確認できます。
Windowsだと「\/:*?"<>|」
#フォルダの区切り文字が半角¥と表示できるかは環境に依ります他にもエクスプローラーでファイル名に使ってみようとすると警告が出るので確認できます
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
すべての返信
-
Gtk とか libglib-2.0-0.dll など全く知識がないのでハズレかもしれませんが・・・
質問者さんが作成したプログラムが Any CPU または x64 でコンパイルされていて、libglib-2.0-0.dll が 32-bit 版しかない場合、64-bit OS 上では動かないのですが、そういう問題ではないのでしょうか?
何故動かないかの説明、32/64-bit どちらで dll が作られているかを調べる方法、どのように解決したらいいかなどは以下のページが参考になると思います。
Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspxPart 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspxハズレでしたら失礼しました。
-
BadImageFormatException は 32bit プロセスが 64bit DLL を読み込もうとしたとき、あるいは 64bit プロセスが 32bit DLL を読み込もうとしたときに出ることが多いです。
今回のケースでは、64bit に変えて逆に NG になっていますね。32bit に戻したうえで、libglib-2.0-0.dll やそれに付属する DLL ファイルが適切な場所に配置されているかを確認することでしょうか。
PATH を通すのが最適なのか、アプリケーションフォルダーにコピーするのが最適なのかは調べていないのでわかりませんが、再配布方法について調べていただいたほうがよいかと思います。- 編集済み AzuleanMVP, Moderator 2014年12月6日 6:42
- 回答の候補に設定 星 睦美 2014年12月8日 5:49
-
Azulean さんの回答と一部ダブリますがが・・・
Visual Studio が Express 版でなければ、質問者さんの作っているプログラムのコンパイルオプションを x86 にして、libglib-2.0-0.dll を 32-bit 版に戻したらどうなりますか?
先に紹介した記事の Part 2 の方を見てください。上記は、その記事の Step 9 の中の下の図の「例 4.」ようにすると言うことです。
Visual Studio が Express 版ですとコンパイルオプションの変更は公式にはサポートされてませんが、ウラワザ的に変更する手段はあるようです。visual studio express x86 などをキーワードにググってみてください。
-
バージョン:Visual Studio 2013
言語:C#
.Net Framework 4.5.1
開発環境:Windows 7 Home (64bit)(iOSにParallels DesktopでWindows7を入れています。)
配布環境:Windows 7 Home (64bit)
あるプログラムでBitmapクラスを用いて、あるグラフを作成しようとしています。
プログラムを実行すると、Saveメソッドのところで以下のエラーがでてしまいます。
型 'System.NotSupportedException' のハンドルされていない例外が mscorlib.dll で発生しました
追加情報:指定されたパスのフォーマットはサポートされていません。
対処として、mscorlib.dllを.exeの作成されるファイルの場所に置いてみましたが、同じエラーがでてしまいます。
どうしたらエラーがでなくなるでしょうか?
ご回答宜しくお願いします。
以下にプログラムの一部を一応載せておきます
・・・
Bitmap b = new Bitmap (IMAGE_WIDTH, IMAGE_HEIGHT);
Graphics g = Graphics.FromImage (b);
Rectangle r = new Rectangle (0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
public static void PlotEnergy (Graphics g, Bitmap b, NPlot.PlotSurface2D s, Rectangle r, string prefix, double press)
{
g.FillRectangle (Brushes.White, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
PlotLine (s, World.Particles[0].Record.Time, World.Particles[0].Record.Energy, "Energy of Electron for Time", "Time[ns]", "Energy[eV]");
s.Draw (g, r);
b.Save (string.Format ("result/{0}_energy(freq:{1}, offset:{2}, temp:{3}, press{4}).png", prefix, freq, offset, temp, press).ImageFormat.Png);←ここでエラーがでます。
}
- 結合 星 睦美 2014年12月8日 5:41 一連の質問
-
ちょっと前に質問者さんが開いた以下 ↓ のスレッドと関係ある話ですよね?
であれば、上のスレッドを解決するまでフォローして、解決してクローズした後で新たな質問をするようにしていただけますか。
スレッドの乱立は、フォーラムの参加者の皆さんに迷惑です。
-
string.Formatでファイル名を作っていますが、残念ながらWindowsではファイル名に半角スラッシュ(/)と半角コロン(:)は使えません。
別の文字か全角などで代用しましょう。System.IO.Path.GetInvalidPathChars()で実行環境のパスで仕様できない文字の一覧が確認できます。
Windowsだと「\/:*?"<>|」
#フォルダの区切り文字が半角¥と表示できるかは環境に依ります他にもエクスプローラーでファイル名に使ってみようとすると警告が出るので確認できます
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
BadImageFormatExceptionですが、stackoverflowに.NET4.xで使用すると出るというような記載が上がっています。
.NET3.5用アプリとしてであれば通るようです。
glib-sharp.dllのサポートassemblyが.Net4.xに対応したものがないか確認してみてはいかがででしょうか?
- 編集済み CryEarth tomoyuki sasaki 2014年12月8日 2:29
-
皆様ありがとうございます。
ちょっと話は変わりますが、もう一つ質問です。
今、以上までのプログラムにプラスしてエクセルにデータを書き込む処理をプログラムしました。
そこで、プログラムを実行すると、エクセルデータを保存する処理のところで
型 'System.Runtime.InteropServices.COMException' の初回例外が Elsim.exe で発生しました
追加情報:'result2.xlsx' は読み取り専用です。アクセスできません。というエラーが発生してしまいます。読み取り専用で作成していませんし、そのようなパラメータも設定していないはずですが・・・
対処がわかる方教えてほしいです。
以下コード(一部、エラー処理などは全くないです・・・)
class ElSim
{
static MainWindow win;
//const int IMAGE_WIDTH = 3508;
//const int IMAGE_HEIGHT = 2480;
const int IMAGE_WIDTH = 1169;
const int IMAGE_HEIGHT = 827;
const double freq = 2.45E+9; //[Hz]
const double offset = 0; //[rad]
const double temp = 298.15; //[K]
const double press = 133.322;//[Pa]=1[Torr]
const double TrialNum = 1.0E+3;
static StreamWriter writer = new StreamWriter("result/result.txt");
static Excel._Application oExcelApp = new Excel.Application();
static Excel.Workbook oExcelWBook;
static Excel._Worksheet oWSheet;
static string filename;
public static void Main(string[] args)
{
Application.Init();
win = new MainWindow();
win.Show();
Thread thread = new Thread(new ThreadStart(Execute));
thread.Start();
Application.Run();
}
public static void Execute()
{
NPlot.PlotSurface2D s = new NPlot.PlotSurface2D();
Bitmap b = new Bitmap(IMAGE_WIDTH, IMAGE_HEIGHT);
Graphics g = Graphics.FromImage(b);
Rectangle r = new Rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
//writer = new StreamWriter ( "result/result.txt");
oExcelApp.DisplayAlerts = false;
oExcelApp.Visible = false;
filename = System.IO.Directory.GetCurrentDirectory() + "/result/result2.xlsx";
if (System.IO.File.Exists(filename))
{
win.PutResult(filename + "\n");
oExcelWBook =
(Excel.Workbook)(oExcelApp.Workbooks.Open(filename));
oWSheet = (Excel.Worksheet)oExcelWBook.ActiveSheet;
}
else
{
win.PutResult("エクセルは存在しません\n");
}
int num = 1; // 同条件下での試行回数(モンテカルロ法のため)
#if true
// 2次元でのエネルギー変化を記録
World.Record.Initialize ();
World.Initialize (2, freq, offset, temp, press, num);
for (int i = 0; i < TrialNum; i++) {
World.Update ();
win.UpdateProgress (i / TrialNum);
}
World.WriteRecord ();
win.PutResult (World.ToString ());
writer.Write(World.ToString());
WriteExcel(num);//(2);
PlotEnergy (g, b, s, r, "dim2");
//PlotPosition (g, b, s, r, "dim2");
#endif
writer.Close();
oExcelWBook.Close();
oExcelApp.Quit();
}
public static void WriteExcel(double num)//(int num)
{
win.PutResult("エクセルに書き込み中・・・");
double length = TrialNum;
for (int i = 0; i < length; i++)
{
//oWSheet.Cells[i + 1, j + 1] = World.Particles[j].Record.CollisEnergy[i];
oWSheet.Cells[i + 1, 1] = World.Particles[0].Record.Time[i];
oWSheet.Cells[i + 1, 2] = World.Particles[0].Record.Vx[i];
oWSheet.Cells[i + 1, 3] = World.Particles[0].Record.Vy[i];
//oWSheet.Cells[i + 1, 4] = World.Particles[0].Record.Vz[i];
oWSheet.Cells[i + 1, 4] = World.Particles[0].Record.V[i];
}
oExcelWBook.CheckCompatibility = false;
oExcelWBook.SaveAs(filename);←ここでエラーがでる。
win.PutResult("保存しました。");
}
-
> ちょっと話は変わりますが、もう一つ質問です。
話が変わる場合は、別に新たにスレッドを立てて質問するようにしてください。
基本的に一つの表題で、その表題に関する Q&A を完結させてください。- 編集済み SurferOnWww 2014年12月8日 18:09 一部追記