2011-08-05 7 views
6

私は多くのアプリケーションを開発するために派生することができる多くの基本クラスからなるフレームワークを持っています。これらのクラスの中には、System.Windows.Forms.Panelのサブクラスがあり、それに対して独自のデザイナを作成しました。 Visual Studio 2005ではすべてが正常に動作していますが、VS2010に移行しようとすると何かがうまくいかなくなります。これは私がやっているものの多く単純化したバージョンです:Visual Studioはアセンブリをどこで探すのですか?

public interface IConf 
{ 
    string foo { get; set; } 
    void InitFoo(); 
} 

public class SimpleClass 
{ 
    public string foo; 
} 

public class ConfLoader 
{ 
    public static IConf LoadConf() 
    { 
     AssemblyName anAssemblyName = new AssemblyName("ConfClasses"); 
     Assembly anAssembly = Assembly.Load(anAssemblyName); 
     IConf result = (IConf)anAssembly.CreateInstance("ConfClasses.ConfClass"); 
     result.InitFoo(); 
     return result; 
    } 
} 

はその後CoreClassesを参照し、一つだけ含むプロジェクトConfClassesがあります:

私はインターフェイスと2つのクラスを含んでCoreClasseというプロジェクトを持っていますクラスの実装IConf:

public class ConfClass : IConf 
{ 
    public SimpleClass confVal; 

    public string foo 
    { 
     get { return confVal.foo; } 
     set { confVal.foo = value; } 
    } 

    public void InitFoo() 
    { 
     confVal = new SimpleClass(); 
     confVal.foo = "bar"; 
    } 
} 

そして最後にのみCoreClassesを参照し、パネルのサブクラスと関連するデザイナーが含まれているコントロールのプロジェクトがあります:

[Designer("MyControls.Design.SimplePanelDesigner", typeof(IRootDesigner))] 
public class SimplePanel : Panel 
{ 
    public SimpleClass dummy = new SimpleClass(); 
} 

public class SimplePanelDesigner : DocumentDesigner 
{ 
    public IConf DesignerConf; 

    public SimplePanelDesigner() 
     : base() 
    { 
     DesignerConf = ConfLoader.LoadConf(); 
    } 
} 

ここで、これらのDLLをすべて参照し、SimplePanelの空のサブクラスを含む別のソリューションを作成します。 SolutionExplorerでこのクラスをダブルクリックすると、SimplePanelDesignerのコンストラクタが実行され、ConfLoaderのLoadConfメソッドが呼び出されます。これは、ConfClasses.dllがdinamicallyロードされ、ConfClassのインスタンスが作成されることを意味します。この例外が発生したときにInitFooが呼び出されると、この例外が発生します。

ファイルまたはアセンブリ 'CoreClasses、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'、または依存関係。システムは、指定されたファイルを見つけることができません。

この例では例外が実際には発生していませんが、これは実際のアプリケーションが実行している種類のもので、例外はあります。私はここで何が起こっているのか分からない。 VSはCoreClassesにあるメソッドを実行しています。なぜそれをもう一度ロードしようとしていますか?それはどこを探していますか?現在のAppDomainもチェックしましたが、ロードされたアセンブリの中にCoreClassesがあり、変更されていないようです。

すべてのプロジェクトは共通のフォルダ(プロジェクトフォルダ内の通常のobj/debugフォルダではありません)にビルドされており、起動時に他のDLLがPCにはありません私のテスト。次に、参照されたすべてのdllのコピーが、私のuserprofileのAppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssembliesフォルダにある一連のフォルダで実行されます。これはVSがAssembly.LoadそこにCoreClassesのコピーを見つけることができます。すべてのフォルダをきれいにして、すべてを再構築し、すべての組み合わせでさまざまなソリューションを開いたり閉じたりしたが、改善はしていなかった。

EDIT:

GranMasterFlushが示唆したように、これは例外で生成されFusionLogです:

=== Pre-bind state information === 
LOG: User = FCDB\fc0107 
LOG: DisplayName = XEngine.Core, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null (Fully-specified) 
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : (Unknown). 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: The same bind was seen before, and was failed with hr = 0x80070002. 
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002). 

EDIT 2

ただ、いくつかの情報を追加するために、私はフュージョンログを見ていました私の簡単な例で生成され、CoreClassesを読み込もうとしている間に全く同じログが生成されていることがわかりましたが、VisualStudioはそれに対処する方法を見つけました。

+0

私は[procmon](http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)を使って、実際には 'AppData \ Local \ Microsoft \ VisualStudio \ 11.0 \ ProjectAssemblies \ <いくつかの一時的な名前>。最終的には、私のカスタムコントロールがスレッドを開始しようとしていたためです( 'DesignMode'プロパティは動作しません。[this solution](http://stackoverflow.com/questions/39648/good-way-to-debug)参照)。ビジュアルスタジオデザイナーエラー))。私は、[この記事](http://msdn.microsoft.com/en-us/library/ms996457.aspx)で設計時の動作をデバッグする方法について慎重に検討しました。 – pelesl

答えて

4

何が起きているのか分かりました。単純な例と実際の違いは、AddInが関与しているという事実です。 これはかなりログの話ですが、これはそれです。
コードサンプルからわかるように、参照を追加しないように、RefClassを使用してConfClasses dllを読み込みます。これは実行時には問題ありませんが、デザイナーはIConfをIConfにキャストすることができないと言って不平を言っています。これは、デザイナの起動時に、AppClass.dllがAppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssembliesから読み込まれ、ConfClasses.dllがmy binフォルダから読み込まれ、その参照もCoreClasses.dllの2つのバージョンさまざまなバージョンのIConfがあります。
私は、設計時にAssembly.Loadでアセンブリをロードし、そのアセンブリへの参照を追加し、最後のデザイナウィンドウが閉じられたときに参照をクリーンアップするAddInを開発しました。
すべてが問題なくVS2005を使用していましたが、ProcMon.exeを使用してVS2010がアセンブリを探す新しいフォルダを追加しました。プログラムファイル(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ CommonExtensions \ DataDesign
アセンブリをそこにコピーしましたが、すべてが再び機能します。今は手動でそこに物を追加する方法を見つけることの唯一の問題です。

2

アセンブリバインディングログビューアを使用して、このアセンブリの読み込みに失敗した理由を調べてみましたか?

http://msdn.microsoft.com/en-us/library/e74a18c4%28v=vs.71%29.aspx

それを使用する方法についてここでは別の記事があります:

http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

EDIT:

DLLの保存されていますか?このforum postも同様の問題があります。問題は、GAC、実行可能ディレクトリ、または実行可能ディレクトリのサブフォルダにないDLLが参照されていたためです。

+0

私は質問にFusionLogを追加しましたが、私にはあまり意味がありません。 –

+0

私のすべてのプロジェクトには出力パスとして1つのフォルダが設定されているので、すべてのdllは同じフォルダにあります。 Visual Studioの1つです。アセンブリはこのフォルダから読み込まれるのではなく、AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssembliesのサブフォルダに作成されたコピーからロードされます。ここではすべてを見つけることができます。 –