質問者
自作コンポーネントのメンバを参照できない場合がある

質問
-
初めて投稿させて頂きます。
ComponentクラスやUserControlクラス、他にも.NETが用意しているコントロール(PictureBoxやButton、Panelなど)を継承した自作のコンポーネントを開発しています。
メンバ変数やメソッド、プロパティといった、自分の使い勝手に合わせたメンバを宣言しています。
通常、ツールボックス経由でフォームに貼り付けたり、自分でコンストラクトのコードを書くことにより、いずれの場合もこれらコンポーネントのインスタンスが作成されるため、メンバを参照する事ができます。
しかし、すでにdllファイルとして出力された同一のコンポーネントを使用している場合に、正常にメンバを参照できるプロジェクトと、メンバを参照する事ができないプロジェクトが存在する事があり、少々困っております。
「メンバが参照できない」というのは、デザイナでプロパティを見ることすらできず、ソース上からもメソッドやプロパティが参照されません。しかしこの場合、親クラスのメンバだけは参照する事が可能です。
単純に、コンポーネントを使用する側となるフォームのプロジェクトを作り直したからといって解決にはなりませんでした。
(メンバを参照できる場合も、できない場合もあります)
開発したPC内でこの症状は起こらず、dllファイルの配布先PCでこの症状が稀に発生します。
配布先の環境でコンポーネントのプロジェクトをビルドしてdllファイルを作り直しても、症状に変化はありませんでした。
もし同一の症状が起きた方や、何かお気付きの点がある方がおられましたら、アドバイスお願い致します。
開発側環境
OS:Windows XP Professional Edition ServicePack2インストール済み
IDE:Visual Studio C# 2005 Professional Edition 現時点で最新ServicePackをインストール済み
配布先環境
OS:Windows Vista Business Edition
IDE:Visual Studio C# 2005 Express Edition 現時点で最新ServicePackをインストール済み
すべての返信
-
「メンバが参照できない」というのは、デザイナでプロパティを見ることすらできず、ソース上からもメソッドやプロパティが参照されません。しかしこの場合、親クラスのメンバだけは参照する事が可能です。この現象だけ見ると、そのメンバーがprotectedになっているだけにしか見えませんが、
そういうわけではないんですよね?
メンバーのアクセシビリティは何になっていますか?
開発したPC内でこの症状は起こらず、dllファイルの配布先PCでこの症状が稀に発生します。
dllやビルド元のソースなどでバージョンの不整合は確実にないでしょうか?
また、そのdllを開発したPC側でも、dllとして参照しているのでしょうか?
#ソースコードを単に流用しているとかだと、アクセシビリティがinternalになっているだけという可能性もあります。 -
よねKENさん、返信ありがとうございます。
この現象だけ見ると、そのメンバーがprotectedになっているだけにしか見えませんが、
そういうわけではないんですよね?
メンバーのアクセシビリティは何になっていますか?メンバのアクセシビリティは、publicのものだけを参照したいと思っております。
例えば、プロパティだけはどのコンポーネントでも全てpublicにしてあります。
用途によってpublic、private、protectedを使い分けていますが、メソッド/メンバ変数/プロパティのどれかに最低1つはpublicで宣言しているメンバを存在させています。
dllやビルド元のソースなどでバージョンの不整合は確実にないでしょうか?
また、そのdllを開発したPC側でも、dllとして参照しているのでしょうか?
#ソースコードを単に流用しているとかだと、アクセシビリティがinternalになっているだけという可能性もあります。開発側PCにはコンポーネントを作成するプロジェクトがあり、ビルドをしてDLLファイルを作成します。
出来上がったDLLファイルを参照/正常な動作できるかどうか開発側PCでテストアプリケーションを作成し、OKであれば他のPCにDLLファイルのみ配布します。
この時に、あるPCではメンバを参照できる、あるPCではメンバを参照できない、という事態になります。
あるPCというよりは、あるプロジェクトではOKだったり、NGだったりします。
例えば、無事メンバを参照する事ができたPCで、新規にフォームアプリケーションのプロジェクトを作成して、DLLへの参照を同じように設定した場合でも、なぜかOK/NGの事態が発生します。
Visual Studioの立ち上げなおしても、PCを再起動しても問題は解決されませんでした。
配布先PCの環境としてはどちらもOSはVistaで、IDEはVC# Express Editionを使用しています。
配布先PCのOSがXPの場合は、今のところは正常に動作していますが、試験回数が少なくて参考にはなりません。
通常はDLLファイルだけを配布し、コンポーネントのプロジェクト(ソースコード)は配布しておりません。
メンバが参照できない時には、コンポーネントのプロジェクトを配布して、配布先の環境でビルドをしてDLLを作り直していますが、効果がありませんでした。
アクセシビリティにinternalは一切使用していません。
原因がVistaにあるのか、VSのバグにあるのか、DLLファイルの出力設定に問題があるのか、あるいは他の何かなのか・・・原因が掴めないでいます。
自作コンポーネント(クラス)のインスタンスは作成されているのに、publicであるメンバがなぜ参照できないのか・・・すごく不思議です。
(ツールボックスから自作コンポーネントを貼り付けると、ButtonやPictureBoxを貼り付けるのとbutton1やpictureBox1というインスタンスが作成されるのと同様で、自作コンポーネントのインスタンスも作成する事ができます。
もしくはOriginalComponentという自作コンポーネントがあった時に、ソース上から
OriginalComponent originalComponent1 = new OriginalComponent();
originalComponent1. ← ここでキーボードからドットボタンを押すとメンバを参照できるはずですが、正常に表示されるプロジェクトがあったり、一切メンバが表示できないプロジェクトがあったりします。ここでいうプロジェクトは、フォームアプリケーションになります。「メンバが表示できる」という場合は、親クラスのメンバ+自作メンバが表示され、「メンバが表示できない」という場合は、親クラスのメンバのみが表示されます。)
-
hideto2007 さんからの引用 しかし、すでにdllファイルとして出力された同一のコンポーネントを使用している場合に、正常にメンバを参照できるプロジェクトと、メンバを参照する事ができないプロジェクトが存在する事があり、少々困っております。 「メンバが参照できない」というのは、デザイナでプロパティを見ることすらできず、ソース上からもメソッドやプロパティが参照されません。しかしこの場合、親クラスのメンバだけは参照する事が可能です。
このあたりからして、不具合の可能性もありますので、一度確実に再現できる手順があれば教えて頂けませんでしょうか?
私の方で試してみたのですが、再現できませんでした...あとは現象が起きる場合と起きない場合とで、何らかの切り分けをしていくしかなさそうですね。