4

バックグラウンド

SourceForge の TreeViewAdv(TVA) プロジェクトを vb.net に変換しています。ここまでで、コードの変換、ビルド、新しいプロジェクトへの dll の参照の追加、ツールボックスへのコントロールの追加、フォームへのコントロールの追加、およびコントロール プロパティの変更に成功しました。また、ビルドする前に、Aga.Controls 名前空間を受け入れる機能をフォームにコーディングしました。

問題

TVA コントロールを配置したアプリケーションをデバッグしようとすると、次のエラーが表示されます。保護レベルにより、アクセスできない場合があります。' その名前空間へのすべての呼び出しで。そのため、SourceForge でこの問題を調査しました。この問題について説明しているスレッドhttps://sourceforge.net/p/treeviewadv/discussion/568369/thread/005e61ef/があります。おそらく、誰かがこのような行動を見たときに問題が何であるかを理解しましたが、彼らの知恵の詳細を共有することはできませんでした. 一般的な問題は、2008 年にコンパイルされた dll を 2010 プロジェクトで参照する場合、「VS 2010 では、メイン アセンブリとは別のデザイナーが必要になる」ということです。 私はそこで人々に連絡を取ろうとしましたが、フォーラムのどのスレッドにも実際の活動はまったくないようです. それが私の最初の質問につながります...

質問)

1.) 希望を超えて期待していますが、特に treeviewadv プロジェクトのためにこれを成功させた StackOverflow の誰かがいますか? もしそうなら、何が行われたかについてのやや詳細な説明、または最終的なコード/修正の短い説明をいただければ幸いです。これが非常にありそうにないことは理解していますが、「方法」についてより一般的な質問をする前に質問すると思いましたか?

2.) 番号 1 の法案に適合する人を除いて、この一般的なプロセスの知識と、少なくとも TVA プロジェクトの十分な知識を持ち、この取り組みで私と一緒に働きたいと思っている人はいますか?

2.) 1 と 2 を除いて、プロジェクトでこれを行ったことがあり、一般的なプロセスを比較的詳細に説明したり、サンプルコードを示したりできる人はいますか?

3.) 1、2、および 3 を除いて、上記の方法で VS2008 プロジェクトを更新する方法を概説している、アクセスできる特に優れたリソースはありますか?

免責事項

私は、このプロセスが複雑すぎてここで議論できないことを理解しています。そのため、必要に応じて他の場所で議論/努力を行っていきます. カテゴリ 1 または 2 の誰かが (私の質問に答えてください/これについて私と協力して) でき、議論を別の場所で行う必要があると思われる場合は、SO に関する正式なメカニズムがないように思われるため、相互に連絡する方法を教えてください。回答が見つかった場合に共有できるように、ここに結果を投稿 (またはリンク) することにまだ興味があります。

4

2 に答える 2

0

確認された問題の原因

最初に指摘したいのは、参照されている dll の名前空間を追跡できなくなる問題は、その dll にカスタム UI エディター/デザイナーが存在することが原因であったということです。

修正

カスタム エディター/デザイナーを「プライマリ」クラス ライブラリから分離する一般的なプロセスは次のとおりです

1.)プロジェクト内のすべてのカスタム エディター/デザイナーを検索します。プロジェクトにある程度の知識しかない場合は、ソリューション全体で「UITypeEditor」を検索(Ctrl + F)することをお勧めします。あなたがそれを設計した人なら、問題はないはずです。

2.)カスタム エディター/デザイナー クラス全体を削除またはコメント アウトします。ドキュメントを簡単にするためにコメントアウトすることを好みます (戻る必要がある場合に備えて)。

3.)ソリューションで新しいプロジェクトを作成します。ソリューションが表示されない場合 (つまり、プロジェクトしか表示されない場合)、[ツール] --> [オプション] --> [プロジェクトとソリューション] に移動します。「常にソリューションを表示する」というチェックボックスが表示されます。解決策を明らかにした後、右クリックして追加を選択します - >新しいプロジェクト... 名前は何でもかまいませんが、コードにはほとんどまたはまったく影響しません。

4.)新しいプロジェクト内で、Class1 を便利な名前に変更します。カスタム エディター/デザイナー クラスを最初に保持していたファイルの先頭にあるすべての「using」ステートメントを転送します。 編集: プライマリ プロジェクトから必要な型にアクセスできる名前空間に using ステートメントを追加します。各クラスに適切な名前空間を宣言します。カスタム クラスをコピーして正しい名前空間に貼り付けます (必要に応じて、すべてのカスタム エディター/デザイナーをこの 1 つのファイルに配置できます)。'internal' として宣言されているすべてのクラスを 'public' に変更します (internal はアセンブリのスコープのみです)。

5.)新しいプロジェクトに参照が必要な場合は、ここで追加します。カスタム エディターでカスタム タイプを編集している場合は、それらのタイプを定義するプロジェクトへの参照が必要になる可能性があります。これらのタイプが「プライマリ」アセンブリで定義されている場合、循環参照の問題が発生する可能性があるため、少し扱いに​​くい場合があります。これを回避する 1 つの方法 (おそらく正しい方法) は、これらの型の宣言をプライマリ アセンブリから削除し、その宣言のためだけに新しいプロジェクト/アセンブリを作成することです。何らかの理由でプライマリ アセンブリから分離できない場合は、以前にプライマリ アセンブリで作成された成功したビルド (dll) を脇に置き、それを参照します。これにより、これらのタイプのコードの将来の持続可能性が低下する可能性がありますが、それが必要な場合は今すぐ作業を完了できます。

6.)カスタム エディター/デザイナー プロジェクトをデバッグした後、それをビルドし、そのプロジェクトのビルド (dll) を参照としてプライマリ プロジェクト/アセンブリに追加します。

7.)内部でデバッグし、ソリューションで新しいプロジェクトを作成し、両方の dll (プライマリおよびカスタム エディター) を参照に追加ます。設計時と実行時の両方で、コントロール/プロパティが想定どおりに動作することを確認します。

8.) 最後に、外部でデバッグします。新しいソリューションを作成し、両方の dll を参照して、機能を確認します。ネイティブ ソリューションと外部の両方でデバッグするのはやり過ぎに思えるかもしれませんが、環境間で動作に多くの違いがあることがわかりました。徹底してください。

重要な注意:両方のdllを追加する必要があることを理解するのに長い時間 を費やしました。プライマリ dll だけをテスト プロジェクトに追加すると、両方が追加されたかのように動作します。プライマリアセンブリが他のアセンブリを参照しているため、これは合理的でした(そして非常にダンディでした)。ただし、Visual Studio を閉じて開くと機能しません。簡単に言えば、両方のdllを追加します。

TreeViewAdv 仕様

1.) 2 つのカスタム UIEditor がありました。1 つ目は、標準の .NET CollectionEditor を継承する NodeControlCollectionEditor と呼ばれる NodeControlsCollection.cs にあります。追加された唯一の機能は、エディターが使用できるコントロールの種類を明示的に割り当てることでした。これは主に、すべての NodeControl タイプをコレクションに追加できるようにするための回避策として行われたようです (これにはタイプ NodeControl を渡す必要がありました) が、抽象タイプをインスタンス化できないため、NodeControl タイプを渡すとエラーが発生するという事実を回避します。 . 2 つ目は、StringCollectionEditor.cs の StringCollectionEditor です。これも標準の .NET CollectionEditor を継承し、少し機能を追加します (目的は不明)。

2 - 4.)一般的なプロセスと同じです。

5.) 現在、後者の方法を使用する必要がありました (カスタム UIEditor が参照できるように、Aga.Controls の dll を取っておきます)。後で、オブジェクト宣言の一部をプライマリ アセンブリから分離して、ソリューションの信頼性を高めたいと考えています。

6 - 8.) 元のバグ (aga 名前空間の喪失) は、テスト アプリケーションを同じソリューション内で実行した場合 (プロジェクトが異なっていても) 発生しませんでした。さらに、外部で機能する一部の修正が内部で正しく実行されず、その逆も同様でした。したがって、両方の環境でテストするための私のアドバイスです。

最後のリクエスト 私の質問の一般的な内容と詳細の両方がここで回答されていますが、Plutonix の助けは私が解決策にたどり着くのに不可欠でした。これを答えとしてマークしている間。私が答えを見つけるのを助けるために彼が費やした努力を考慮して、人々がPlutonixの答えにも賛成票を投じてくれることを望みます(具体的でない場合でも彼の答えも正しいという事実に加えて)。

編集:上記のプロセスは、元の TVA C# コードを変更したときに機能しました。結果の DLL を参照して、VB.net プロジェクトで正常に使用することさえできました。VB.net に変換した TVA コード行に同じプロセスを適用しようとすると、最初と同じ問題が発生しました。アプリケーションを実行するまではすべてが機能し、その後 aga 名前空間が見えなくなります。

解決策の編集: (参照を失うプロジェクトの) プロパティに移動します-> [コンパイル] タブ --> [高度なコンパイル オプション] ボタン。ターゲット フレームワークで、まだ「.NET Framework 4」に変更していない場合は変更します。その値がすでに選択されている場合は、別の原因を調べている可能性があります。

于 2013-11-16T23:35:46.107 に答える