代码是否可以在将程序集加载到AppDomain中时执行

时间:2015-10-28 12:22:48

标签: c# plugins .net-assembly appdomain

是否可以编写代码,在使用AppDomain将程序集加载到Assembly.Load时会自动执行?我需要此信息,因为我们的PlugIn系统加载了PlugIns,然后检查它们是否有效,因为它们在signature中包含attribute

修改

我想知道插件的创建者是否能够在加载程序集时执行代码。如果可能,我们会遇到一些安全问题。

3 个答案:

答案 0 :(得分:1)

从安全角度来看,我在深入研究这个问题时做了以下发现:

来自another question的堆栈溢出中的

,Jon Skeet说:“我不相信有任何方法可以强制方法在程序集加载时运行”

如果其他人说过,我会忽略它,但如果Jon Skeet说它不可能,那可能是不可能的。

其次,我深入测试了Module Initializers。 这只会在实例化程序集中的类之前触发代码。 如果没有显式实例化程序集中的类,则模块初始化程序也不会触发。

如果代码中的某处或域中运行的第三方代码可能会在您的应用程序域中加载并实例化具有特定接口或基类或属性的所有类,那么可能不知道这个代码。在这种情况下,这些类的构造函数中的代码将在实例化后立即触发。

但除此之外,通过测试我能想到的所有场景和想法,并在网上进行搜索,我得出的结论是,通过简单地加载程序集就无法在程序集中执行代码。

答案 1 :(得分:0)

AppDomain.AssemblyLoad Event允许您在将程序集加载到AppDomain时处理事件。您可以在链接的页面上找到一个示例。

答案 2 :(得分:0)

虽然这并没有直接回答这个问题,但它确实为所提问题提供了一个很好的解决方法。

如果需要反映程序集中的类型,同时希望100%确定程序集中没有代码被执行。 您可以使用Assembly.ReflectionOnlyLoadFrom方法实际执行此操作而无需将程序集实际加载到AppDomain中。 这将允许您查看它们在程序集中的类型,但不允许您实例化它们中的任何一个,也不会将程序集加载到AppDomain中。

将此示例视为exlanation

public void AssemblyLoadTest(string assemblyToLoad)
{
    var initialAppDomainAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Count(); //4

    Assembly.ReflectionOnlyLoad(assemblyToLoad);
    var reflectionOnlyAppDomainAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Count(); //4

    //Shows that assembly is NOT loaded in to AppDomain with Assembly.ReflectionOnlyLoad
    Assert.AreEqual(initialAppDomainAssemblyCount, reflectionOnlyAppDomainAssemblyCount); // 4 == 4

    Assembly.Load(assemblyToLoad);
    var loadAppDomainAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Count(); //5

    //Shows that assembly is loaded in to AppDomain with Assembly.Load
    Assert.AreNotEqual(initialAppDomainAssemblyCount, loadAppDomainAssemblyCount); // 4 != 5
}

如果您只需要像publicKey一样检查程序集的信息,而不是加载程序集,请直接加载AssemblyName:

AssemblyName an = AssemblyName.GetAssemblyName("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;