![](/img/trans.png)
[英]How can I find the names of all shares on a LAN without knowing any machine names using C#?
[英]How can I load all dlls from a folder without knowing their names in c# .net?
以前我使用此调用来加载从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类型的所有程序集。 我该怎么办? 任何帮助都会很棒。
就像在评论中提到的那样,获取文件列表并加载它们不是问题,但是只有一种方法可以删除已加载的程序集,这就是卸载整个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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.