回答の候補 デザイナの動作に関して

  • 2012年6月29日 14:06
     
     

    DD.と申します。

    VS2008、VS2010でのC#における質問なのですが、

    デザイナでフォームを開く際、フォームのコンストラクタやLoadイベントが走るかと思います。

    この、デザイナでフォームを開く時にどのような動作が行われているのか?に関する記述はどこかにあるのでしょうか?(MS公式のものがあれば非常にありがたいです)

    色々探してはみたのですが、うまく見つけることができませんでした。

    どなたかご存知でしたら教えて頂ければと思います。

    一応、この件をお聞きしようと思ったきっかけは、

    C++のライブラリをC++/CLIでラップして、C#から参照しようとし、

    C#のプロジェクトからC++/CLIでラップしたDLLを参照追加しています。

    C#はWindowsフォームアプリケーションで、FormクラスのフィールドにC++/CLIのDLLで定義されているクラスをフィールドとして保持しています。

    この状態でデザイナからフォームを開こうとすると、C++/CLIのDLLもしくは、そこから参照されているDLLが見つからないとのエラーが出てしまいます。(C#作成EXEの起動は問題なし)

    今までも同エラーは見たことがあり、リビルドやDLLのパス、バージョンなどを見直し改善できていましたが、今回は同じようにうまくエラーを取り除くことができませんでした。

    C++/CLIのDLLはC#のプロジェクトから参照追加しているのでパスはわかっているが、C++のDLLについてはC#のプロジェクトからパスが見えないのはもちろんかと思い、

    C#プロジェクトのカレント、bin、obj下のフォルダにC++のDLLを配置してみましたが、うまく参照してくれず・・・

    (VSインストールフォルダ)\Common7\IDE下にC++のDLLを配置すると参照してくれます。(IDEから見ればカレントなので当然なのかもしれませんが・・・)

    ただ、デザイナで編集するためにユーザ定義のライブラリをポンポンIDE下に配置するのはちょっと・・・(プロジェクトのプロパティで参照パスに追加なども実施済)

    上記のような場合、デザイナから見える位置としてどこか適切なライブラリ配置場所が、それを教えて頂ければ解決かもしれませんが、

    デザイナ使用時にはどのようにパス解決を行い、どのようなコードが動かされるのかも、きちんと把握しておきたいと思いました。

    例えば、Loadイベントで通信初期化やログ出力などを行っていた場合、デザイナを使用するたびにそれらも処理されてしまうのか?IOへの入出力はデザイナ時では制限されていたりするかとか?

    (このような内容であれば検証コードを書けばすぐわかる話ですが、厳密にこういう動作が行われている!とされているものがあれば参照したい)

    どうにも色々な疑問がわきでてしまいます。。。

すべての返信

  • 2012年6月29日 22:59
    モデレータ
     
     回答の候補

    VS2010 での挙動に関して、VS から別の VS にアタッチし、読み込まれているモジュール一覧を表示することで特定した情報を共有します。

    デザイナで配置したコントロールを持つアセンブリは、Windows 7 においては以下のフォルダーにコピーされているようです。
    このフォルダーのアセンブリを読み込むので、それに必要な DLL が足りていないのであれば、読み込めないのでしょう。
    C:\Users\(ユーザー名)\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies

    ProjectAssemblies を元に検索したところ、海外のフォーラムでもいくつか情報が見つかります。
    ただ、こうすればよいというきれいな解決ではなく、コピーされた一時フォルダーに必要な DLL を手動でコピーするという対症療法なので、毎回やらないとだめですが…。
    http://social.msdn.microsoft.com/Forums/zh/winformsdesigner/thread/a4b49c0a-a92b-4220-b9c2-033a4594b369

    // あとは環境変数 PATH を変えてしまうと言う思い切ったことをするか。

  • 2012年6月30日 13:28
     
     

    DD.です。 Azuleanさん回答ありがとうございます。

    >ただ、こうすればよいというきれいな解決ではなく、コピーされた一時フォルダーに必要な DLL を手動でコピーするという対症療法なので、毎回やらないとだめですが…。

    もっとわかりやすい位置にDLLをコピーするだけでよければありがたいですが・・・微妙ですね^^;

    >// あとは環境変数 PATH を変えてしまうと言う思い切ったことをするか。

    これは考えたのですが、影響範囲が大きすぎるので・・・断念しました。

    色々なヒントを頂けたかと思いますので、さらに調べてみたいと思います。

  • 2012年6月30日 15:52
    モデレータ
     
     

    devenv など、Visual Studio の exe を起動するバッチを作って、そこでプロセスローカルの PATH を書き換えてしまうとか。
    うまくいくかは試していないので、失敗したらごめんなさい。

    set PATH=%PATH%;c:\hogehoge
    C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe

  • 2012年7月2日 12:58
     
     

    Azuleanさん回答有難う御座います。

    >devenv など、Visual Studio の exe を起動するバッチを作って、そこでプロセスローカルの PATH を書き換えてしまうとか。

    ローカルのPATHですか。なるほど。

    試してみたいと思います。

  • 2012年7月3日 1:25
     
      コードあり

    >>デザイナでフォームを開く際、フォームのコンストラクタやLoadイベントが走るかと思います。

    継承元フォームのコンストラクタやLoadイベントは走ると思いますけど、
    自身のコンストラクタやLoadイベントって走りましたっけ?

    ケースによりますがデザインに必要な処理でないのであれば、
    継承元フォームの各メソッドの処理させたくない部分の前に

                if (DesignMode)
                {
                    return;
                }

    としてあげれば良い様な気もします。