Тип класса C # - Как определить, является ли это стандартный класс .net Framework - PullRequest
4 голосов
/ 06 мая 2010

C # / .net framework

Какой самый надежный способ определить, является ли класс (тип) классом, предоставляемым .net Framework, а не любым из моих классов или классов сторонних библиотек.

Я проверил несколько подходов

  • Пространство имен, например начиная с «Система».
  • База кодов сборки, где находится dll

Все это "кажется" немного неуклюжим, хотя и работает.

Вопрос: Какой самый простой и надежный способ определить это?

Ответы [ 4 ]

6 голосов
/ 06 мая 2010

Вы можете проверить токен открытого ключа сборки. Сборки Microsoft (BCL) будут иметь маркер открытого ключа b77a5c561934e089 или b03f5f7f11d50a3a. Сборки WPF будут иметь токен открытого ключа 31bf3856ad364e35.

Как правило, для получения токена открытого ключа сборки можно использовать sn.exe-Tp foo.dll. sn.exe является частью Windows SDK, который у вас уже должен быть.

Вы можете получить токен открытого ключа от полного имени сборки (например, typeof(string).Assembly.FullName), которое является просто строкой, или вы можете получить необработанные байты токена открытого ключа из сборки, выполнив P / Invoke в StrongNameTokenFromAssembly .

2 голосов
/ 06 мая 2010

Считать атрибут сборки компании из сборки [сборка: AssemblyCompany («Корпорация Microsoft»)]

http://msdn.microsoft.com/en-us/library/y1375e30.aspx

using System;
using System.Reflection;

[assembly: AssemblyTitle("CustAttrs1CS")]
[assembly: AssemblyDescription("GetCustomAttributes() Demo")]
[assembly: AssemblyCompany("Microsoft")]

namespace CustAttrs1CS {
    class DemoClass {
        static void Main(string[] args) {
            Type clsType = typeof(DemoClass);
            // Get the Assembly type to access its metadata.
            Assembly assy = clsType.Assembly;

            // Iterate through the attributes for the assembly.
            foreach(Attribute attr in Attribute.GetCustomAttributes(assy)) {
                // Check for the AssemblyTitle attribute.
                if (attr.GetType() == typeof(AssemblyTitleAttribute))
                    Console.WriteLine("Assembly title is \"{0}\".",
                        ((AssemblyTitleAttribute)attr).Title);

                // Check for the AssemblyDescription attribute.
                else if (attr.GetType() == 
                    typeof(AssemblyDescriptionAttribute))
                    Console.WriteLine("Assembly description is \"{0}\".",
                        ((AssemblyDescriptionAttribute)attr).Description);

                // Check for the AssemblyCompany attribute.
                else if (attr.GetType() == typeof(AssemblyCompanyAttribute))
                    Console.WriteLine("Assembly company is {0}.",
                        ((AssemblyCompanyAttribute)attr).Company);
            }
        }
    }
}
0 голосов
/ 06 мая 2010

Пара идей:

В Visual Studio в обозревателе решений разверните Ссылки, щелкните правой кнопкой мыши ссылку, затем выберите Свойства и посмотрите путь, например:
C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.dll

Я предполагаю, что большинство сборок в C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \, вероятно, будут стандартными .NET.

Также вы можете посмотреть сборку в библиотеке MSDN, например:
http://msdn.microsoft.com/en-us/library/system.aspx.

0 голосов
/ 06 мая 2010

Вы говорите о библиотеке базовых классов?

Вы можете проконсультироваться здесь: http://en.wikipedia.org/wiki/Base_Class_Library

...