2011-01-21 21 views
8

/CLRを使用してコンパイルされたC++の「コントロールライブラリプロジェクト」があります。このプロジェクトの中には、ネイティブDLLを呼び出すUser Controlがあります。このユーザーコントロールはデザイナーツールボックスに表示されますが、フォームにドラッグすることはできません。 DLLへの参照がなければ、ユーザーコントロールはうまく使用できますが、参照を使用するときには「ツールボックスアイテムを読み込めませんでした」というメッセージが表示されます。デザイナーがユーザーコントロールを拒否する

ネイティブコールは機能し、とにかくユーザーコントロールに影響を与えません。ユーザーコントロールは、DLL呼び出しが含まれているデザイナーだけで正しく表示できます。また、コントロールが手動でフォームに追加され、プログラムとして実行された場合、それは正常に表示されます。

これは、この問題が、そのネイティブDLLがどこにあるかを知る必要があるVisual Studio Designerの問題であると思われます。しかし、私はそれをどのように伝えるか、DLLをどこに置いて見つけられるかは分かりません。私が知る限り、ネイティブDLLを参照するプロジェクト設定には方法がありません。だから、デザイナーはそれがうまくいかないために不平を言っているだけなのです。

これを行う方法はありますか?しようとする

+0

VS 2010またはまた、VS 2008での問題ですか?私たちは同様の麻痺問題を抱えており、VS 2008に戻ってきました... –

+0

私はVS 2008でこの問題を抱えています。 – Nicholas

+0

私はネイティブDLLをC:\ Windows \ System32パスに追加することは成功するかもしれないと思ったが、残念ながらそうではありません。 – Nicholas

答えて

8

残念ながら、VS(つまり、「機能」)の「設計上のバグ」が発生しました。

問題が、ネイティブDLLがどこにあるかを知る必要があるVisual Studioデザイナーの問題であると疑われるのは、部分的にです。それは場所の無知の問題ではなく、むしろ、デザイナーが、コントロールをインスタンス化するために、混合モードアセンブリ(管理コードとネイティブコードの両方を含む)に反映できないという事実です。これにより、ツールボックスには、指定したエラーが表示されます。

回避策は、/clr:pureを使用してC++ソースファイルをコンパイルして、純粋に管理されたEXEを作成することです。


また、追加しようとしているコントロールが64ビットコンポーネントとしてコンパイルされている可能性もあります。 Visual Studioは32ビットプロセスなので、32ビットモジュールのみを実行できます。 64ビットアセンブリへの参照を追加することはできますが、実際には64ビットアセンブリをJITコンパイルしてプロセス内で実行することはできません。

「AnyCPU」設定を使用してユーザー制御アセンブリをコンパイルすると、32ビット環境で32ビットプロセスとして実行され、64ビットプロセスでは64ビットプロセスとして実行されます。 bit環境です。実際には、コードを正しく記述したと仮定すると、これは両方の世界で最高です。


それらの作品のどれもあれば最後に、デザイナーをバイパスするオプションが常にあります。ユーザーコントロールをインスタンス化し、そのプロパティをフォームの初期化子に設定するのに必要なコードを書き込むことはできます。あなたが失うことになるのは、Visual Studio内のデザイナーの内部でコントロールを使用することだけです。実行時にすべてが期待どおりに動作します。

+0

このコードのx64とx86バージョンを作成していますが、ここでは問題ではないと言われているx64プラットフォームの問題は既に隔離されています。 – Nicholas

+0

このデザイナーの問題のために、私はすでにデザイナーをバイパスし、フォームコントロールを手動でインスタンス化しています。 – Nicholas

+0

私は/ clr:pureフラグを使ってコンパイルすることはおそらくデザイナーの問題をバイパスすることに同意します。残念なことにこのインスタンスでは混合モードアセンブリが必要です。しかし、私の意見では、デザイナーが呼び出さないクラスユーティリティ関数であれば、ネイティブDLLを使用する関数を反映させる必要はありません。 – Nicholas

0

もの:

VS2010:Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssembliesフォルダにDLLをコピーします。

VS2008、VS2010:dllをAppData\Local\Microsoft\VisualStudio\<version>\ProjectAssemblies\フォルダにコピーします。

+0

私はVS2008を使用しているので、最初のオプションでは動作しません。第2の選択肢は、述べたように機能しません。 'ProjectAssemblies'フォルダには、ランダムに名前が付けられたフォルダのみが入力されます。これらのフォルダは、デザイナによって頻繁に自動生成されるように見えます。 Visual Studioは何かを突き刺すたびに新しいフォルダを作成するため、テストする頻度が高すぎます。 ProjectAssembliesフォルダは理論的に潜在的な候補のように見えますが、そこに名前が付けられたランダムなフォルダは実用的ではありません。 – Nicholas

0

Visual Studioがロードできないため、ネイティブDLLへの参照による制御が失敗するようです。 PATH環境変数をグローバルに設定するか、実行時にVisual Studio実行可能ファイルに設定してみてください。それでも問題が見つからない場合は、コントロールのデザイン時の動作をデバッグしてみてください。

+0

私は上記のようにC:\ Windows \ System32パスにネイティブDLLを置くことでこれをカバーしようとしました。あなたはそれが意味することをカバーしませんか? – Nicholas

+0

@Nicholas:同様にあなたのDLLを登録してください - http://www.delphifaq.com/faq/windows_user/f668.shtml –

+0

それはDLLへのパスとは何の関係もない、またはそれがランで動作しません時間。それ以外では、COM/ActiveX DLL以外のものを登録する必要はありません。アプリケーションで使用されている関数のみをエクスポートするDLLの登録には、ポイントがありません(実際は望ましくありません)。 –

1

これは同様の問題のようですか?

https://connect.microsoft.com/VisualStudio/feedback/details/388107/winforms-designer-fails-to-load-managed-dll-having-unmanaged-dependencies#details

だから、MSが正式に回避策としてVS2008からVS2010にアップグレードすると言っているように見えます。

別の回避策を見つけたことがありますか?

この

は私が管理されていないC++プロジェクトを使用して管理C++ラッパープロジェクトを使用してプロジェクトを管理するC#.NETでVS2008で今経験しています問題です。

ビジュアルスタジオが使用しているデザイナーの一時アセンブリのように見えますが、検出された依存ラッパーアセンブリが一時フォルダに読み込まれますが、そのラッパーアセンブリのアンマネージ依存はロードされません。私はこれがC:\ Users \ Username \ AppData \ Local \ Microsoft \ VisualStudio \ 9.0 \ ProjectAssembliesにあることがわかります。デザイナを読み込もうとすると、その中に管理対象DLLがあり、アンマネージ依存関係ではない新しいフォルダがそこに作成されます。残念ながら、上記のマイクロソフトのリンクからの質問の人が、$(TargetDir)を使用した回避策であるとは理解できません。

+0

実際に私はすべての依存DLLを持つフォルダをWindows PATH環境変数に追加すると、Formsデザイナーがうまくレンダリングすることがわかりました。今私はちょうどそこにabosulteパスを持つよりエレガントな方法があるかどうかを確認する必要がありますので、チームの他の開発者が混乱する必要はありません。 –

3

は/DELAYLOAD:"your_native.dll」オプションを使用して、あなたのライブラリーをリンクします。これは私にとって同じ問題を解決しました。

0

私はデザイナーへのコントロールをドロップすることができませんでしたが、既存のコントロールがうまく働いた基本的にことを、あなた(それを引き起こしている可能性がどのように多くのことを知っている?)と同じものであってもよいこれと同様の問題を抱えていました生産とテストの両方でx86のにあなたのソリューションの設定を変更します)

1:ここではレコードの

は、私の解決策でした。これにより、デザイナーにコントロールを置くことができ、周りを動かすことができました。 2)終了したらAnyCPUまたはx64に戻ることができます。私は実際にデザイナーを使っていくつかの値を設定するのを単純化しています.32/64ビットのものは問題を引き起こします。

関連する問題