none
DLLが正しく読み込めない RRS feed

  • 質問

  • C++/CLIで作成したDLLを、C#で読み込むアプリを作成しておりますが、以下のようなエラーが発生してしまいます。

    ファイルまたはアセンブリ 'CliWrapper, Version=1.0.7149.21347, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

    DLL自体はプロジェクトから参照できて使用できるのですが、C#側のデザインで上記のエラーが発生してしまいます。

    ご存知の方がいらっしゃいましたらご教授願います。

    開発環境:Visual Stduio 2019

    C#:Windows フォーム アプリケーション(.NET Framework)

    C++/CLI:CLR クラス ライブラリ

    2019年7月29日 2:58

回答

  • Windows フォームデザイナはそこで使用するコントロールに必要なアセンブリを一時フォルダーにコピーして利用しています。
    このため、その C++/CLI のプロジェクトが外部の DLL に依存していると、必要な DLL がコピーされず、デザイナで開けなくなります。
    (外部の DLL を使っていなくてもダメだったケースもあった気がしますが、不確か…気のせいかもしれない)

    究極的には、デザイナで表示するフォームやユーザーコントロールに C++/CLI の要素を組み込まない方が安定します。
    View とそれ以外を分離するという意味でも、設計を考え直した方が良いと思います。
    (フォームやユーザーコントロール、それらが使用するフィールドにあるクラス・構造体に、C++/CLI の型を一切持たせない。実行時に依存性を注入する考え方に近い?)

    2019年7月29日 13:20
    モデレータ
  • C++/CLI のDLL は x86 版は作成していますか?

    Visual Studio は32bitアプリです。当然デザイナも 32bit アプリですので、C++/CLI の場合は 必ず 32bit版を作成する必要があります。

    デザイナ以外で使わない場合であってもです。

    ActiveX なども同様。アプリが64bit版しかないから。。。などという理由で x64 版しか用意しないとすると、デザイナで使えないという状況になります。

    そのほかは、Azulean さんも書いている通りで、あまりお勧めはできませんね。

    パッと思い浮かぶのはそれくらいかなぁ?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2019年7月30日 1:32

すべての返信

  • DLL参照でしょうか?それともプロジェクト参照でしょうか?もしDLL参照であれば、C++/CLI のDLLおよび、そのDLLが参照する別のDLLがEXEと同じところにあるかを確認してみてください。

    依存するDLLのいずれかがないと、このエラーが発生します。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2019年7月29日 9:23
  • 分かりづらく申し訳ありません、プロジェクト参照になります。

    上記は同ソリューション内に2つのプロジェクトでC#(exe)からCLR(dll)を参照しております。

    2019年7月29日 12:57
  • Windows フォームデザイナはそこで使用するコントロールに必要なアセンブリを一時フォルダーにコピーして利用しています。
    このため、その C++/CLI のプロジェクトが外部の DLL に依存していると、必要な DLL がコピーされず、デザイナで開けなくなります。
    (外部の DLL を使っていなくてもダメだったケースもあった気がしますが、不確か…気のせいかもしれない)

    究極的には、デザイナで表示するフォームやユーザーコントロールに C++/CLI の要素を組み込まない方が安定します。
    View とそれ以外を分離するという意味でも、設計を考え直した方が良いと思います。
    (フォームやユーザーコントロール、それらが使用するフィールドにあるクラス・構造体に、C++/CLI の型を一切持たせない。実行時に依存性を注入する考え方に近い?)

    2019年7月29日 13:20
    モデレータ
  • C++/CLI のDLL は x86 版は作成していますか?

    Visual Studio は32bitアプリです。当然デザイナも 32bit アプリですので、C++/CLI の場合は 必ず 32bit版を作成する必要があります。

    デザイナ以外で使わない場合であってもです。

    ActiveX なども同様。アプリが64bit版しかないから。。。などという理由で x64 版しか用意しないとすると、デザイナで使えないという状況になります。

    そのほかは、Azulean さんも書いている通りで、あまりお勧めはできませんね。

    パッと思い浮かぶのはそれくらいかなぁ?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2019年7月30日 1:32
  • ご回答ありがとうございます。

    C++/CLIで作成したプロパティをC#側でラップしてバインディングさせたりしていたのでデザイナ側で問題がでておりました。

    完全なラッパーを設けるように検討してみます。ありがとうございました。

    2019年7月30日 2:59
  • ご回答ありがとうございます。

    32bitのアプリ、32bitのDLLとして作成しております。

    Azuleanさんのほうでも回答しましたが、View側がC++/CLIに依存しないデザインパターンを検討してみます。ありがとうございました。

    2019年7月30日 3:01