- PR -

ユーザコントロールが継承できない

1
投稿者投稿内容
波乗り大好き
会議室デビュー日: 2006/10/18
投稿数: 3
投稿日時: 2006-10-18 18:37
はじめまして。

現在VS2003、C#、Windowsアプリにて
既存パッケージのカスタマイズをしています。

既存パッケージから提供されているユーザコントロール(Test.dll)を継承し、
新たなユーザコントロールを作成しようとしています。

Test.dllは参照設定に追加しています。

「継承コントロールの追加」からTest.dllを継承元に
コントロールを作成したいのですが、
継承ピッカーでコンポーネント一覧が表示され、
選択すると
「参照'Test'を現在のアプリケーションに追加できません。
 異なるバージョンの'Test'が既に参照されていないことを確認してください。」
と、エラーが出てしまいます。

もちろん別バージョンのTest.dllは存在しません。
また、dllはソースレベルで提供されていないのでリコンパイルする事も出来ず
非常に困っています・・・

何かご存知の方がいましたら、ご教示ください。
よろしくお願いします。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-10-18 18:51
VisualStudio の動作はいろいろと癖がありますね。

継承コントロールを作るだけなら、
新規ユーザーコントロール(新規クラスでもいいかも)を作成し、
クラス宣言部分の継承元を直接エディタで書き換えてしまえば可能だと思います。

フォームデザイナがいろいろ動いてしまうかもしれませんので、
デザイン画面は閉じた状態でコードを修正し、保存してからデザイン画面を開いてみてください。

Test.DLLの参照自体がうまくいっているなら、という前提です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-18 18:55
引用:

波乗り大好きさんの書き込み (2006-10-18 18:37) より:

「継承コントロールの追加」からTest.dllを継承元にコントロールを作成したいのですが、継承ピッカーでコンポーネント一覧が表示され、選択すると
「参照'Test'を現在のアプリケーションに追加できません。
 異なるバージョンの'Test'が既に参照されていないことを確認してください。」
と、エラーが出てしまいます。


新しいプロジェクトを作成して、何度も同じ現象を確認したということなのでしょうか?
エラー内容を見て、真っ先に思いつく '問題の切り分け' 方法です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
波乗り大好き
会議室デビュー日: 2006/10/18
投稿数: 3
投稿日時: 2006-10-19 09:47
masaさん

返信ありがとうございます!
コードから継承元を指定する方法に切り替えました。
無事にデザイン画面も開けています。
Test.DLLの参照はうまく行っているようです。
ありがとうございました。



じゃんぬねっとさん

返信ありがとうございます。
新しいプロジェクトを作成して、何度も同じ現象を確認しています。
真っ先に思いつく '問題の切り分け' 方法とは何なのでしょうか??

現在はコードから継承元を指定してユーザーコントロールを作成できていますが、
あの参照エラーは?という気持ち悪さが残ります。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-10-19 10:38
sln や .csproj ファイルの中を見てみると参照情報が書き込まれています。

以前、NAnt を使ったバッチビルドを行おうと思い、
これらのファイルの中身(xml)を取得して設定ファイルを生成するツールを作成しました。
xmlからの値は Framework を使えば簡単に取得できるのですが、
それを NAnt に渡すと参照エラーが発生することがありました。

詳しい情報がない中でいろいろ調べてみた結果、
DLLの参照先を表す HintPath という項目はそのDLLを最初に追加したときにしかセットされない、などちょっと癖がありました。
仕様が公開されていない?のでそれ以上のことはわかりませんでした。
このときには、ツールに HintPath をリフレッシュするような機能を実装しました。

HintPath が古いままでも VS での製造はできますから、
VS では、プロジェクトを開くときにはこの項目を見ずに参照を解決していることになります。
個々のDLLではなく、プロジェクト単位で参照ディレクトリの候補リストを追加できますが、
それらのディレクトリをサーチしているのでしょう。

しかし、ツールボックスや継承ピッカーなどの動作はこれとも違うような印象があります。
そのほかの項目を使用して参照を解決しているのではないかと思います。
どこかに情報があればいいんですが・・・。




[ メッセージ編集済み 編集者: masa 編集日時 2006-10-19 11:20 ]
波乗り大好き
会議室デビュー日: 2006/10/18
投稿数: 3
投稿日時: 2006-10-19 13:05
引用:

詳しい情報がない中でいろいろ調べてみた結果、
DLLの参照先を表す HintPath という項目はそのDLLを最初に追加したときにしかセットされない、などちょっと癖がありました。
仕様が公開されていない?のでそれ以上のことはわかりませんでした。
このときには、ツールに HintPath をリフレッシュするような機能を実装しました。

[ メッセージ編集済み 編集者: masa 編集日時 2006-10-19 11:20 ]



大変有益な情報ありがとうございます。
実は以前にやったASP.Netの仕事で
ベースとなるページを作成したのですが、
新規ページを追加して、継承元を修正せずにWeb.UIのままで一度保存してしまうと
後から継承元を変更しても全く駄目という現象がありました。

結局どこに情報がセットされているのか解らず、
誤って保存してしまったページは削除して作成し直すという
面倒なことになってしまいました。。。

HintPathの情報はとても為になりました。
ありがとうございました!
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-10-19 14:20
ASP.NET は全くやったことがないのでわかりませんが、
HintPath はあまり関係ないと思いますよ。
VisualStudio 以外のツールでプロジェクトファイルを解析するようなときに注意するだけでいいと思います。多分。


HintPath には、DLLを追加したときのパスが記録されています。
複数のPCで開発する場合、普通は開発ソース・DLLの格納パスをそろえると思いますが、
パスが揃っていないとプロジェクトを開いたときに参照不可な状態になります。

で、見つからない場合は
プロジェクトの共通プロパティ「参照パス」に登録されているパスの中を探しにいきます。
このパスは明示的にパスを追加する他に、
追加したDLLが格納されていたパスが登録されていきます。
各PCの開発パスが統一されていない場合、
それぞれのPCで登録されたパスがたくさん溜まっていると思います。

この参照パスリストは上にあるものが優先されますので、
たまたま上位にあったパスに同じDLLがあるとそれが取得されます。
いろいろなバージョンのDLLが存在している場合には、パスの順番も注意です。



[ メッセージ編集済み 編集者: masa 編集日時 2006-10-19 14:24 ]
1

スキルアップ/キャリアアップ(JOB@IT)