- PR -

リファレンス先のプロジェクトがリファーするものもリファレンスに入れる?

1
投稿者投稿内容
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2004-11-16 04:19
現在、コモンプロジェクトAcommonに新しい機能を追加しようとしています。
Acommonは他の5つのprojからリファーされており(Referenceに登録されており)、合計6つのprojでsolutionが成り立っている状態です。

今回、Acommon でIMessageFilterクラスから継承するMessageFilterクラスを追加したので、AcommonのリファレンスにSystem.Windows.Forms.dllを追加しました。そしてコンパイルしたところ、Acommon以外の5つのprojすべてでエラーが出ました。"MessageFilterクラスをリファーしてるでしょ。継承してるIMessageFilterを定義してるDLLをリファーしないとダメだよ」(英語版を使っているのでメッセージは超訳です)。

実はAcommonをリファーしているprojは30個ほどあり、すべてのprojに新しくリファレンスを追加するのは現実的ではありません。何か、Acommon.projへの変更だけで他のprojは何も変更しないで済むような方法は無いのでしょうか?この動作だと、多くのprojからリファーされているprojに何かを追加することは非常に困難になってしまうのですが、なぜこういう動作になっているのか、ご存知でしたらお教えください。

初めての質問で分かりづらい部分もあるかもしれませんが、よろしくお願いします。
菊池
会議室デビュー日: 2004/11/15
投稿数: 19
投稿日時: 2004-11-16 18:19
MessageFilterクラスが public になっているのではないでしょうか。
internal にすれば良いと思います。

MessageFilterクラスをpublicにどうしてもする必要があるなら
System.Windows.Formsの内容がpublicに出ないように実装するとか

コード:
namespace ClassLibrary1
{
    public class MessageFilter
    {
        internal class internalMessageFilter : IMessageFilter
        {
            public internalMessageFilter()
            {

            }

            bool IMessageFilter.PreFilterMessage(ref Message msg)
            {
                return false;
            }
        }

        internal internalMessageFilter instance;

        public MessageFilter()
        {
            instance = new internalMessageFilter();
        }

        public void InstallMessageFilter()
        {
            System.Windows.Forms.Application.AddMessageFilter(instance);
        }
    }
}



 上記のコードでは System.Windows.Formsはそれを参照するプロジェクトでは要求されません。

_________________
Microsoft Valueable Professional C# 2004
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2004-11-17 10:56
ご指摘どうも有り難うございました。しかし残念ながら、internalに指定しても同じエラーが出てしまいます。

更に色々いじっている内に、ネームスペースが関係することが判明しました。
MessageFilterクラスをネームスペースBAR.FOO の下で宣言しており、他のprojではBAR.FOO.AAA, BAR.FOO.BBB などの下でクラスを宣言しています。この状態だとエラーが発生します。

しかし、MessageFilterをBAR.FOO.XXXという新しいネームスペースの下で宣言すると、エラーは発生しません。また、BAR.FOO.AAAで宣言すると、BAR.FOO.AAAを使用しているprojのみエラーが発生し、BAR.FOO.BBBのprojは問題なくビルドできます。MessageFilterクラスをpublicにしてもinternalにしてもこの現象は同じです。

この現象をシンプルに再現するために実験用のソリューションを作ってみましたが、そちらではどういうわけか再現できません(業務で関わっている比較的大き目のソリューションでしか起きません)。このような状態に陥るソリューションの設定があるのでしょうか?

1つの環境でしか再現出来ていないという困った状況ですが、いいアイデアがあればよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-17 21:44
私の失敗経験:
  MyProject.DataTableという名前空間を作った

 これにより、
コード:
#using System.Data
#using MyProject


とすると、単に"DataTable"と宣言すると、開発者はSystem.Data.DataTableクラスのつもりなのにコンパイラはMyProject.DataTable名前空間と解釈してしまう。


 こんなことが起こっていたりして。
_________________
1

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