0

iis で mef パーツをロードする際に問題があります。ロード方法は次のようになります。

private void LoadPlugins(string path)
{
    var aggregateCatalog = new AggregateCatalog();
    var directoryCatalogExe = new DirectoryCatalog(path, "*.exe");
    aggregateCatalog.Catalogs.Add(directoryCatalogExe);
    var container = new CompositionContainer(aggregateCatalog);
    container.ComposeParts(this);
}

この方法は、コンソール アプリケーションまたは cassini で完全に機能します。iis ではパーツ数は 0 です - エラーもイベントログにも例外はなく、何もありません...

何が起こっているのか全くわかりません。パスは 100% 正しいです。

4

3 に答える 3

2

@stakxの評価に同意します。コンテナの作成には別のアプローチを使用して、環境にとらわれないようにしています。インターフェイスを作成します。

/// <summary>
/// Defines the required contract for implementing a composition container factory.
/// </summary>
public interface ICompositionContainerFactory
{
    #region Methods
    /// <summary>
    /// Creates an instance of <see cref="CompositionContainer"/>.
    /// </summary>
    /// <returns>An instance of <see cref="CompositionContainer"/>.</returns>
    CompositionContainer CreateCompositionContainer();
    #endregion
}

デフォルトの実装 (コンソール アプリ、サービス ホストで動作) の場合:

public class DefaultCompositionContainerFactory : ICompositionContainerFactory
{
    #region Methods
    /// <summary>
    /// Creates an instance of <see cref="CompositionContainer"/>.
    /// </summary>
    /// <returns>
    /// An instance of <see cref="CompositionContainer"/>.
    /// </returns>
    public CompositionContainer CreateCompositionContainer()
    {
        var domain = AppDomain.CurrentDomain;
        string path = domain.BaseDirectory;

        // Use the base directory from where the application is running.
        var catalog = new DirectoryCatalog(path);

        // Create the container.
        var container = new CompositionContainer(catalog);

        return container;
    }
    #endregion
}

そして、Web固有の実装:

public class WebCompositionContainerFactory : ICompositionContainerFactory
{
    #region Methods
    /// <summary>
    /// Creates an instance of <see cref="CompositionContainer"/>.
    /// </summary>
    /// <returns>
    /// An instance of <see cref="CompositionContainer"/>.
    /// </returns>
    public CompositionContainer CreateCompositionContainer()
    {
        string path = HttpRuntime.BinDirectory;

        // Use the base directory from where the application is running.
        var catalog = new DirectoryCatalog(path);

        // Create the container.
        var container = new CompositionContainer(catalog);

        return container;
    }
    #endregion
}

構成を通じて配線します。

考慮すべきもう 1 つのことは、*.exe をカタログ フィルターとして渡していることです。Web アプリケーションで実行可能なアセンブリを使用していますか?

于 2012-07-13T11:26:28.360 に答える
1

考えられる原因の 1 つは、 の値が間違っている可能性がありますpath

たとえば、現在のディレクトリがコードの"bin"ディレクトリになると想定しないでください"."

それがあなたがしていることである場合は、に基づいてパスを指定してみてくださいAssembly.GetExecutingAssembly().Location:

// using System.IO;
// using System.Reflection;    

string binPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
LoadPlugins(binPath);
于 2012-07-13T11:11:50.260 に答える
0

コンソール アプリまたは Cassini と IIS で実行している場合の違いは、セキュリティ コンテキストです。

コンソール アプリまたは cassini を実行している場合、セキュリティ コンテキストはログオンしているユーザー、つまりあなたです。

IIS で実行している場合、セキュリティ コンテキストはアプリケーション プールの ID であり、既定では NETWORK SERVICE です。

MEF パーツが、NETWORK SERVICE からもアクセスできないディレクトリにある可能性があります。

于 2012-07-13T11:12:06.970 に答える