1

以前は、この呼び出しを使用して、Rule クラスから拡張されたすべての cs ファイルをロードしていました

var repository = new RuleRepository();
repository.Load(x => x.From(typeof(Rule1).Assembly));

上記のように Load メソッドを呼び出すと、Rule1.cs と同じタイプのすべてのクラス ファイル (Rule クラスから拡張されたすべてのファイル) がリポジトリ メモリに読み込まれます。現在、これらすべての .cs ファイル (Rule1.cs) を dll に変換し、これらの dll を含むフォルダーをスキャンすることにしました。どうすればこの動作を実現できますか? 現在、私はこのようなことをしています

Assembly assembly1 = Assembly.LoadFile(Server.MapPath("Rule1.dll"));
List<Assembly> asmblyList = new List<Assembly>();
asmblyList.Add(assembly1);
repository.Load(x => x.From(asmblyList));

フォルダーからタイプ Rule1.dll のすべてのアセンブリをスキャンしたいと考えています。どうすればそれを行うことができますか?どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

言及されたコメントのように、ファイルのリストを取得してそれらをロードすることは問題ではありませんが、ロードされたアセンブリを削除する唯一の方法があり、これは AppDomain 全体をアンロードすることです。この例を見てください:

static void Main(string[] args)
{
    var path = AssemblyDirectory + @"\external\";
    var files = Directory.GetFiles(path); //get all files

    var ad = AppDomain.CreateDomain("ProbingDomain"); //create another AppDomain
    var tunnel = (AppDomainTunnel)
        ad.CreateInstanceAndUnwrap(typeof (AppDomainTunnel).Assembly.FullName,
        typeof (AppDomainTunnel).FullName); //create tunnel

    var valid = tunnel.GetValidFiles(files); //pass file paths, get valid ones back
    foreach (var file in valid)
    {
        var asm = Assembly.LoadFile(file); //load valid assembly into the main AppDomain
        //do something
    }

    AppDomain.Unload(ad); //unload probing AppDomain
}

private class AppDomainTunnel : MarshalByRefObject 
{   
    public string[] GetValidFiles(string[] files) //this will run in the probing AppDomain
    {
        var valid = new List<string>();
        foreach (var file in files)
        {
            try
            {   //try to load and search for valid types
                var asm = Assembly.LoadFile(file);
                if (asm.GetTypes().Any(x => x.IsSubclassOf(typeof (Rule1))))
                    valid.Add(file); //valid assembly found
            }
            catch (Exception)
            {
                //ignore unloadable files (non .Net, etc.)
            }
        }
        return valid.ToArray();
    }
}
//found here: http://stackoverflow.com/a/283917/4035472
public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}
于 2016-01-19T12:25:18.460 に答える