English 中文(简体)
2. 无需装入目前附录的习俗组合特性
原标题:Getting custom assembly attributes without loading into current AppDomain

我在规定目录中为重新装饰装饰装饰而设计了一个小的申请,并阅读了它们的习俗特性收集。 基本上只是读到《可转让货物》,以确定可以担保的IsJITrackingEnabled和IsJITOptimizerDisabled,以确定大会是否得到优化释放。

我目前的法典是大会。 LoadFrom 转而走整条道路,装上。 之后,议会中出现了“GetCustomAttributes”,以获得可变的属性。 问题是,每组装上目前手头。 因此,如果另一组人使用同一组,则只使用原先装货的参照。 我希望能够装载大会,读到我所需要的特性,然后卸下。 我试图制造新的信 app,然后把议会装入,然后在字后卸下议会,但无用。

I know this must be possible but I am at a loss. Any help would be greatly appreciated. I d be happy to provide any other information you may need as well.

最佳回答

答案是,没有,就没有办法去做你再次要求的话。

答案越长: 有一种特殊组装方法,Assembly.ReflectionOnlyLoad(,其中使用了“只选取”负荷环境。 这让你装载无法执行但能够读到其元数据的组件。

在你的案件中(显然,在每一种使用情况下,我都可以亲临),这并不真正有益。 不能从这种组装中划出属性,只有<条码>。 这一类别没有为特定特性的过滤提供任何良好方式(我可以提出的最佳办法是将其放在一个插座和使用

更糟糕的是,光顾的负荷不会装上任何依赖性集会,但迫使你手工操作<>。 这比你现在更客观地恶化了;至少现在,你自动装载依赖物。

(此外,我先前的回答提到了教育、青年和体育部;我错了,似乎教育、青年和体育部包含着一整套习俗反思法典来开展这项工作。)

归根结底,一旦装满,你就无法卸下装货。 如entire app area

最新资料:

正如在评论中指出的,我得以通过只考虑负荷(和正常负荷)获得你所需要的属性信息,但由于缺乏分类的属性元数据,这造成了严重的痛苦。

如果装上正常的组装,你可以很容易地获得所需要的信息:

var d = a.GetCustomAttributes(typeof(DebuggableAttribute), false) as DebuggableAttribute;
var tracking = d.IsJITTrackingEnabled;
var optimized = !d.IsJITOptimizerDisabled;

如果被装入只考虑的范畴,你就能够做一些工作;你必须说明特性构造者采取的形式,知道违约价值是什么,并将这些信息与每个财产的最终价值结合起来。 你们得到你们所需要的信息:

var d2 = a.GetCustomAttributesData()
         .SingleOrDefault(x => x.ToString()
                                .StartsWith("[System.Diagnostics.DebuggableAttribute"));

从那以后,你需要核对<代码>。 Constructor Arguments to see which Constructionor was known: this one , 有一个论点或

if (d2.ConstructorArguments.Count == 1)
{
  var mode = d2.ConstructorArguments[0].Value as DebuggableAttribute.DebuggingModes;
  // Parse the modes enumeration and figure out the values.
}
else
{
  var tracking = (bool)d2.ConstructorArguments[0].Value;
  var optimized = !((bool)d2.ConstructorArguments[1].Value);
}

最后,你需要检查<代码>NamedArguments,该编码可能高于建筑商规定的标准,例如:

var arg = NamedArguments.SingleOrDefault(x => x.MemberInfo.Name.Equals("IsJITOptimizerDisabled"));
var optimized = (arg == null || !((bool)arg.TypedValue.Value));

在一份最后说明中,如果你在2.0或2.0以上的电网下运行,并在MSDN中看到斜线,那么在DebuggingModes<>/code><<<<<<>>><<<>>><>>>>>><<>>>>> 文件:

在“网络框架”2.0版中,JIT跟踪信息总是生成的,这一旗帜与Default具有相同的作用,但IsJITTrackingEnabled Property为假,第2.0版没有意义。

问题回答

您需要使用<条码>。

http://blogs.msdn.com/b/junsheng/archive/2004/08/24/219691.aspx” rel=“nofollow noreferer”>MSDN Notes,显示如何使用:

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

public class ReflectionOnlyLoadTest
{
    public ReflectionOnlyLoadTest(String rootAssembly) {
        m_rootAssembly = rootAssembly;
    }

    public static void Main(String[] args)
    {
        if (args.Length != 1) {
            Console.WriteLine("Usage: Test assemblyPath");
            return;
        }

        try {
            ReflectionOnlyLoadTest rolt = new ReflectionOnlyLoadTest(args[0]);
            rolt.Run();
        }

        catch (Exception e) {
            Console.WriteLine("Exception: {0}!!!", e.Message);
        }
    }

    internal void Run() {
        AppDomain curDomain = AppDomain.CurrentDomain;
        curDomain.ReflectionOnlyPreBindAssemblyResolve += new ResolveEventHandler(MyReflectionOnlyResolveEventHandler);
        Assembly asm = Assembly.ReflectionOnlyLoadFrom(m_rootAssembly);

        // force loading all the dependencies
        Type[] types = asm.GetTypes();

        // show reflection only assemblies in current appdomain
        Console.WriteLine("------------- Inspection Context --------------");
        foreach (Assembly a in curDomain.ReflectionOnlyGetAssemblies())
        {
            Console.WriteLine("Assembly Location: {0}", a.Location);
            Console.WriteLine("Assembly Name: {0}", a.FullName);
            Console.WriteLine();
        }
    }

    private Assembly MyReflectionOnlyResolveEventHandler(object sender, ResolveEventArgs args) {
        AssemblyName name = new AssemblyName(args.Name);
        String asmToCheck = Path.GetDirectoryName(m_rootAssembly) + "\" + name.Name + ".dll";
        if (File.Exists(asmToCheck)) {
            return Assembly.ReflectionOnlyLoadFrom(asmToCheck);
        }
        return Assembly.ReflectionOnlyLoad(args.Name);
    }

    private String m_rootAssembly;
}

现在不可能把大会卸下来,这只是方式。 该网络的目的是不幸地开展工作。 即便是“反思”的负荷也是如此。 这样做还有一点小小.,然后需要使用GetCustomAttributesData而不是正常的GetCustomAttributes,因为后者需要在特性构造者中操作代码。 这将使生活更加困难。

应当使用,Cecil允许你在不实际装上正常设备的情况下检查集会。 但这是许多额外的工作。

我相信大会。 反省是你所期待的。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...