none
.exeが作成される場所と同じ場所に.dllを配置してもエラーが出る。 RRS feed

  • 質問

  • バージョン: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をコピー

    したのですが、やはり同様のエラーがでてしまいます。

    どうしたら良いでしょうか

    ご回答宜しくお願いします。

    2014年12月6日 4:55

回答

  • 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.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx

    ハズレでしたら失礼しました。

    2014年12月6日 5:23
  • string.Formatでファイル名を作っていますが、残念ながらWindowsではファイル名に半角スラッシュ(/)と半角コロン(:)は使えません。
    別の文字か全角などで代用しましょう。

    System.IO.Path.GetInvalidPathChars()で実行環境のパスで仕様できない文字の一覧が確認できます。
    Windowsだと「\/:*?"<>|」
    #フォルダの区切り文字が半角¥と表示できるかは環境に依ります

    他にもエクスプローラーでファイル名に使ってみようとすると警告が出るので確認できます


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年12月6日 15:45 禁止文字一覧追加
    • 回答の候補に設定 星 睦美 2014年12月8日 5:50
    • 回答としてマーク かめやまんだー 2014年12月9日 14:09
    2014年12月6日 15:27

すべての返信

  • 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.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx

    ハズレでしたら失礼しました。

    2014年12月6日 5:23
  • ありがとうございます。

    64ビットで動くdllに変更したら、以上のエラーはでなくなりましたが、次に以下のエラーがでてきました。

    型 'System.BadImageFormatException' のハンドルされていない例外が glib-sharp.dll で発生しました

    追加情報:間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外:0x8007000B)

    どうしたらよいか教えて頂けると幸いです。

    よろしくお願いします。

    2014年12月6日 6:07
  • BadImageFormatException は 32bit プロセスが 64bit DLL を読み込もうとしたとき、あるいは 64bit プロセスが 32bit DLL を読み込もうとしたときに出ることが多いです。
    今回のケースでは、64bit に変えて逆に NG になっていますね。

    32bit に戻したうえで、libglib-2.0-0.dll やそれに付属する DLL ファイルが適切な場所に配置されているかを確認することでしょうか。
    PATH を通すのが最適なのか、アプリケーションフォルダーにコピーするのが最適なのかは調べていないのでわかりませんが、再配布方法について調べていただいたほうがよいかと思います。

    2014年12月6日 6:32
    モデレータ
  • libglib-2.0-0.dll自身ではなく、libglib-2.0-0.dllの要求するDLLが足りてないんでしょうね。入手元には何か説明はなかったのでしょうか?

    一応、技術的には開発者コマンドプロンプト上で

    DUMPBIN /dependents libglib-2.0-0.dll

    と実行することで要求される具体的なファイル名を知ることはできますが…。

    2014年12月6日 8:48
  • Azulean さんの回答と一部ダブリますがが・・・

    Visual Studio が Express 版でなければ、質問者さんの作っているプログラムのコンパイルオプションを x86 にして、libglib-2.0-0.dll を 32-bit 版に戻したらどうなりますか?

    先に紹介した記事の Part 2 の方を見てください。上記は、その記事の Step 9 の中の下の図の「例 4.」ようにすると言うことです。

    Visual Studio が Express 版ですとコンパイルオプションの変更は公式にはサポートされてませんが、ウラワザ的に変更する手段はあるようです。visual studio express x86 などをキーワードにググってみてください。

    2014年12月6日 9:08
  • バージョン: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 一連の質問
    2014年12月6日 14:08
  • ちょっと前に質問者さんが開いた以下 ↓ のスレッドと関係ある話ですよね?

    https://social.msdn.microsoft.com/Forums/ja-JP/f911a5a2-3f01-4bd5-8756-58f16e979c08/exedll?forum=vsgeneralja

    であれば、上のスレッドを解決するまでフォローして、解決してクローズした後で新たな質問をするようにしていただけますか。

    スレッドの乱立は、フォーラムの参加者の皆さんに迷惑です。

    2014年12月6日 14:49
  • string.Formatでファイル名を作っていますが、残念ながらWindowsではファイル名に半角スラッシュ(/)と半角コロン(:)は使えません。
    別の文字か全角などで代用しましょう。

    System.IO.Path.GetInvalidPathChars()で実行環境のパスで仕様できない文字の一覧が確認できます。
    Windowsだと「\/:*?"<>|」
    #フォルダの区切り文字が半角¥と表示できるかは環境に依ります

    他にもエクスプローラーでファイル名に使ってみようとすると警告が出るので確認できます


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年12月6日 15:45 禁止文字一覧追加
    • 回答の候補に設定 星 睦美 2014年12月8日 5:50
    • 回答としてマーク かめやまんだー 2014年12月9日 14:09
    2014年12月6日 15:27
  • BadImageFormatExceptionですが、stackoverflowに.NET4.xで使用すると出るというような記載が上がっています。

    .NET3.5用アプリとしてであれば通るようです。

    glib-sharp.dllのサポートassemblyが.Net4.xに対応したものがないか確認してみてはいかがででしょうか?


    2014年12月8日 2:21
  • フォーラム オペレーターの星 睦美です。

    かめやまんだー さん、
    先に投稿いただいた質問への回答が続いていますので、私のほうで二つの質問を統合させていただきました。

    質問への回答を確認いただいて、疑問な点や詳しく聞きたい点がありましたら返信いただければと思います。
    フォーラムで参考になる回答には、投稿者からの[回答としてマーク]をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年12月8日 5:45
  • 皆様ありがとうございます。

    ちょっと話は変わりますが、もう一つ質問です。

    今、以上までのプログラムにプラスしてエクセルにデータを書き込む処理をプログラムしました。

    そこで、プログラムを実行すると、エクセルデータを保存する処理のところで

    型 '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("保存しました。");

            }

    2014年12月8日 16:11
  • > ちょっと話は変わりますが、もう一つ質問です。

    話が変わる場合は、別に新たにスレッドを立てて質問するようにしてください。

    基本的に一つの表題で、その表題に関する Q&A を完結させてください。
    • 編集済み SurferOnWww 2014年12月8日 18:09 一部追記
    2014年12月8日 18:04