0

私はいくつかのコードを持っています

var type = Type.GetType("namespace, assembly");
return Activator.CreateInstance(type);

これはほとんどの状況で正常に機能しますが、Cassini/Visual Studio 開発サーバーを使用してデバッグされた Web サイトの Global.asax でこのコードが参照されると、型が見つかりません。

型は参照されていないアセンブリにありますが、通常は実行中のアセンブリと同じ出力ディレクトリにあります。ただし、よく調べてみると、Cassini のデバッグ中に、実行中のアセンブリと参照されている各アセンブリが C:\users...\AppData\Local\Temp\Temporary ASP.NET Files\root... の独自のディレクトリに配置されているようです。 ..しかし、明らかに「参照されていない」アセンブリはありません。

VS に余分なリソースを一時ディレクトリにコピーさせる方法、または指定したディレクトリから実行させる方法はありますか? IIS を使用することが唯一の解決策ですか?

前もって感謝します。

4

2 に答える 2

1

これは Cassini が行っていることではないと思います。これは ASP.NET が .NET シャドウ コピーを使用して DLL のロックを防止しているためです。したがって、IIS を使用しても何も変わらないはずです。明示的な参照がないため、.NET は DLL を別のディレクトリに置くことができたようです。

この参照された DLL を GAC に配置できますか?

于 2010-02-25T00:03:58.230 に答える
0

これは、最初の回答に対するあなたのコメントへの回答です (「他に考えられる解決策はありますか?」)...

はい、非常に簡単な解決策があり、それは「問題」を引き起こしているのと同じソースから来ています(ネタバレ...そのSystem.AppDomain)。AppDomain クラスには、応答できる「AssemblyResolve」というイベントがあります (AppDomain.CurrentDomain を使用して「自分の」AppDomain インスタンスを取得します)。イベントは、見つからないアセンブリの名前 (文字列) を提供します。問題のアセンブリの場所を知っていると思いますので、System.Reflection.Assembly.Load(pathToYourAssembly) を使用してアセンブリをロードし、「Load」メソッドが返す Assembly インスタンスを返します。「AssemblyResolve」イベント ハンドラは少し異なります。戻り値の型があるため、イベント ハンドラーで「return thisAssembly;」を実行します。ここで「thisAssembly」Load メソッドの戻り値です。AppDomain には、「想定される」アセンブリで型が見つからない場合に備えて、TypeResolve イベント (およびその他) もあります。これは、あるアセンブリから別のアセンブリに型を移動し、その型を参照する他のすべてを再コンパイルしていない場合に発生する可能性があります。とにかく、それが誰かを助けることを願っています。私はこれが古い質問であることを知っています。

于 2014-05-06T05:45:28.017 に答える