1

UserControlを含むC#プロジェクトがあります。

このユーザーコントロールは、特定のC ++混合モードdllに依存します。このdllは、アンマネージC++DLLのファサードとして機能します。

                     C#           C++ Mixed            C++ Umnanaged
  [ main app ] ---> [ myUC ] ---> [ OCShell.dll ] ---> [ OCC.dll ]

デザインビューで、UserControlを追加できません。OCShell(またはその依存関係の1つ)にFileNotFoundExceptionがあることを示しています。ただし、コードを介して、すべてが正常に機能します。メインアプリ(Windowsフォーム)でできます

myUC uc = new myUC();
this.Controls.Add(uc);

これは正常に機能します。適切なコードが正しく実行されます。

Dependency Walkerで確認しましたが、すべて問題ありません。すべてがBin\Debug \ディレクトリに適切にコピーされ、それらのDLLのそれぞれが相互に認識します。

私の推測では、デザインビューエディタはそれらのDLLの適切なパスをチェックしないため、エラーが返されます。

また、すべてのdllをソリューション内のすべての可能なディレクトリにコピーしようとしましたが、それも役に立ちませんでした

4

2 に答える 2

3

はい、それは問題です。問題は、コードがアプリではなくVisualStudioで実行されていることです。依存アセンブリの検索に使用されるプローブパスには、VSのプライベートディレクトリ(Common7 \ IDE \ PrivateAssembliesおよびPublicAssemblies)のみが含まれ、プロジェクトのビルドディレクトリは含まれません。OCShell.dllをそれらのディレクトリの1つにコピーすることで検索できますが、アンマネージDLLは、ウィンドウがDLLを検索するときに検索するディレクトリに配置する必要があります。マニフェストを必要とするWindowsサイドバイサイドキャッシュを除いて、これはシステムPATH環境変数上のディレクトリに制限されます。

これらは楽しいオプションではありません。最善の方法は、これらのDLLのコードが設計時に実行できないようにすることです。これを行うには、DesignModeプロパティを使用し、Trueの場合は呼び出しをバイパスします。これは、少なくともコンストラクターとLoadイベントで実行する必要があります。他のイベントも実行できます。また、アンマネージコードのバグが原因でVisualStudioがクラッシュする可能性を大幅に最小限に抑えます。これがコントロールのデザイン時のビューに影響を与える場合は、それを補うためにデザイナーを作成する必要があります。

于 2010-07-23T20:46:36.220 に答える
1

私も同じ問題を抱えていました。他の多くのDLLを使用し、おそらくC ++で記述されたDLLがある場合、多くの場合、他の多くの依存関係が必要になります。実行時に、それらは完全に解決されますが、デザインモードでは解決されません。

Hans Passantの回答を使用して、このDLLに関連するすべての関数呼び出しの前にこのコードを配置する必要があります。

if ( !DesignerProperties.GetIsInDesignMode(this) ) 

DLLから2つのConnect()と2つのDisconnect()呼び出しがあり、これを毎回前に置いた後、DesignerはUserControlのレイアウトを完全にロードできるようになりました。解決してくれてありがとう。

于 2015-03-10T13:48:04.947 に答える