Пошаговое руководство. Внедрение типов из управляемых сборок в Visual Studio

Внедряя сведения о типе из управляемой сборки со строгим именем, можно свободно объединять типы в приложении, делая версию независимой. Это означает, что в программе можно использовать типы из любой версии управляемой библиотеки, т. е. необходимость компиляции для каждой новой версии отпадает.

Внедрение типов часто используется с COM-взаимодействием, например в приложениях, использующих объекты автоматизации из Microsoft Office. Сведения о типе внедрения позволяют одной и той же сборке программы работать с различными версиями Microsoft Office на разных компьютерах. Тем не менее внедрение типа можно также использовать с полностью управляемыми решениями.

После указания открытых интерфейсов, доступных для внедрения, создайте реализующие их классы среды выполнения. Во время разработки клиентская программа встраивает сведения о типе для интерфейсов, ссылаясь на сборку, содержащую открытые интерфейсы, и присваивая свойству Embed Interop Types ссылки значение True. После этого клиентская программа может загружать экземпляры объектов среды выполнения, типизированные как указанные интерфейсы. Это эквивалентно использованию компилятора командной строки и ссылке на сборку с помощью параметра компилятора EmbedInteropTypes.

При создании новой версии сборки среды выполнения со строгим именем повторная компиляция клиентской программы не требуется. Клиентская программа продолжает работать с той версией сборки среды выполнения, которая ей доступна, используя сведения о внедренном типе для открытых интерфейсов.

С помощью этого пошагового руководства:

  1. Создайте сборку со строгим именем и открытым интерфейсом, содержащим сведения о типе, который может быть внедрен.
  2. Создайте сборку среды выполнения со строгим именем, реализующую открытый интерфейс.
  3. Создайте клиентскую программу, внедряющую сведения о типе из открытого интерфейса и создающую экземпляр класса из сборки среды выполнения.
  4. Внесите изменения и создайте сборку среды выполнения заново.
  5. Запустите клиентскую программу, чтобы увидеть, что новая версия сборки среды выполнения используется без повторной компиляции.

Примечание

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Условия и ограничения

Вы можете внедрить информацию о типах из сборки при следующих условиях:

  • Сборка предоставляет по крайней мере один открытый интерфейс.
  • Внедренные интерфейсы снабжаются аннотацией с указанием атрибутов ComImport и Guid с уникальными GUID.
  • Сборка снабжается аннотацией с указанием атрибута ImportedFromTypeLib или атрибута PrimaryInteropAssembly, а также атрибута сборки Guid. По умолчанию шаблоны проектов Visual C# и Visual Basic включают атрибут сборки Guid.

Так как основной функцией внедрения типа является поддержка внедрения сборок COM-взаимодействия, при внедрении сведений о типе в полностью управляемое решение применяются следующие ограничения:

  • Внедряются только атрибуты, характерные для COM-взаимодействия. Другие атрибуты игнорируются.
  • Если тип включает универсальные параметры внедренного типа, использовать этот тип за границей сборки невозможно. Граница сборки пересекается, например, при вызове метода из другой сборки или выведении типа из типа, определенного в другой сборке.
  • Константы не внедряются.
  • Класс System.Collections.Generic.Dictionary<TKey,TValue> не поддерживает использование внедренного типа в качестве ключа. Для поддержки внедренного типа в качестве ключа можно реализовать свой собственный тип словаря.

Создание интерфейса

Первый шаг заключается в создании сборки интерфейса для эквивалентности типов.

  1. В Visual Studio последовательно выберите Файл>Создать>Проект.

  2. В диалоговом окне Создание проекта введите библиотека классов в поле Поиск шаблонов. Выберите шаблон Библиотека классов (.NET Framework) для C# или Visual Basic в списке и щелкните Далее.

  3. В диалоговом окне Настроить новый проект в поле Имя проекта введите TypeEquivalenceInterface и нажмите кнопку Создать. Проект создан.

  4. В обозревателе решений щелкните правой кнопкой мыши файл Class1.cs или Class1.vb, выберите пункт Переименовать и переименуйте файл с Class1 на ISampleInterface. Ответьте Да на запрос, чтобы также переименовать класс на ISampleInterface. Этот класс представляет открытый интерфейс для класса.

  5. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceInterface и выберите пункт Свойства.

  6. Выберите элемент Сборка в левой области экрана Свойства и задайте в поле Путь вывода расположение на компьютере, например C:\TypeEquivalenceSample. Данное расположение используется в рамках всего этого пошагового руководства.

  7. Выберите Сборка>Строгое именование в левой области экрана Свойства, а затем установите флажок Подписать сборку проверка. В файле ключа строгого имени выберите Обзор.

  8. Перейдите к и выберите файл key.snk , созданный в проекте TypeEquivalenceInterface , а затем нажмите кнопку ОК. Дополнительные сведения см. в статье Создание пары открытого и закрытого ключей.

  9. Откройте файл класса ISampleInterface в редакторе кода и замените его содержимое следующим кодом, чтобы создать интерфейс ISampleInterface:

    using System;
    using System.Runtime.InteropServices;
    
    namespace TypeEquivalenceInterface
    {
        [ComImport]
        [Guid("8DA56996-A151-4136-B474-32784559F6DF")]
        public interface ISampleInterface
        {
            void GetUserInput();
            string UserInput { get; }
        }
    }
    
    Imports System.Runtime.InteropServices
    
    <ComImport()>
    <Guid("8DA56996-A151-4136-B474-32784559F6DF")>
    Public Interface ISampleInterface
        Sub GetUserInput()
        ReadOnly Property UserInput As String
    End Interface
    
  10. В меню Сервис выберите пункт Создать GUID и в диалоговом окне Создание GUID выберите Формат реестра. Выберите Копировать, а затем Выход.

  11. В атрибуте Guid кода замените пример GUID на скопированный GUID и удалите фигурные скобки ( { } ).

  12. В обозревателе решений разверните папку Свойства и выберите файл AssemblyInfo.cs или AssemblyInfo.vb file. В редакторе кода добавьте в файл следующий атрибут:

    [assembly: ImportedFromTypeLib("")]
    
    <Assembly: ImportedFromTypeLib("")>
    
  13. Выберите Файл>Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов и проекта.

  14. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceInterface и выберите пункт Сборка. DLL-файл библиотеки классов компилируется и сохраняется по указанному пути вывода сборки, например C:\TypeEquivalenceSample.

Создание класса среды выполнения

Далее создайте класс среды выполнения для эквивалентности типов.

  1. В Visual Studio последовательно выберите Файл>Создать>Проект.

  2. В диалоговом окне Создание проекта введите библиотека классов в поле Поиск шаблонов. Выберите шаблон Библиотека классов (.NET Framework) для C# или Visual Basic в списке и щелкните Далее.

  3. В диалоговом окне Настроить новый проект в поле Имя проекта введите TypeEquivalenceRuntime и нажмите кнопку Создать. Проект создан.

  4. В обозревателе решений щелкните правой кнопкой мыши файл Class1.cs или Class1.vb, выберите пункт Переименовать и переименуйте файл с Class1 на SampleClass. Ответьте Да на запрос, чтобы также переименовать класс на SampleClass. Этот класс реализует интерфейс ISampleInterface .

  5. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceInterface и выберите пункт Свойства.

  6. Выберите Сборка в левой области экрана Свойства , а затем задайте путь вывода в том же расположении, которое использовалось для проекта TypeEquivalenceInterface , например C:\TypeEquivalenceSample.

  7. Выберите Сборка>Строгое именование в левой области экрана Свойства, а затем установите флажок Подписать сборку проверка. В файле ключа строгого имени выберите Обзор.

  8. Перейдите к и выберите файл key.snk , созданный в проекте TypeEquivalenceInterface , а затем нажмите кнопку ОК. Дополнительные сведения см. в статье Создание пары открытого и закрытого ключей.

  9. В обозревателе решений щелкните проект TypeEquivalenceRuntime правой кнопкой мыши и выберите Добавить>Ссылка.

  10. В диалоговом окне Диспетчер ссылок выберите Обзор и перейдите к папке пути вывода. Выберите файл TypeEquivalenceInterface.dll, нажмите кнопку Добавить и затем кнопку ОК.

  11. В обозревателе решений разверните папку Ссылки и выберите ссылку TypeEquivalenceInterface. В области Свойства задайте для параметра Определенная версия значение False, если оно еще не установлено.

  12. Откройте файл класса SampleClass в редакторе кода и замените его содержимое следующим кодом, чтобы создать класс SampleClass:

    using System;
    using TypeEquivalenceInterface;
    
    namespace TypeEquivalenceRuntime
    {
        public class SampleClass : ISampleInterface
        {
            private string p_UserInput;
            public string UserInput { get { return p_UserInput; } }
    
            public void GetUserInput()
            {
                Console.WriteLine("Please enter a value:");
                p_UserInput = Console.ReadLine();
            }
        }
    }
    
    Imports TypeEquivalenceInterface
    
    Public Class SampleClass
        Implements ISampleInterface
    
        Private p_UserInput As String
        Public ReadOnly Property UserInput() As String Implements ISampleInterface.UserInput
            Get
                Return p_UserInput
            End Get
        End Property
    
        Public Sub GetUserInput() Implements ISampleInterface.GetUserInput
            Console.WriteLine("Please enter a value:")
            p_UserInput = Console.ReadLine()
        End Sub
    End Class
    
  13. Выберите Файл>Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов и проекта.

  14. В обозревателе решений щелкните проект TypeEquivalenceRuntime правой кнопкой мыши и выберите Сборка. DLL-файл библиотеки классов компилируется и сохраняется по указанному пути вывода сборки.

Создание клиентского проекта

Наконец, создайте клиентскую программу эквивалентности типов, которая ссылается на сборку интерфейса.

  1. В Visual Studio последовательно выберите Файл>Создать>Проект.

  2. В диалоговом окне Создание проекта введите консоль в поле Поиск шаблонов. Выберите шаблон Консольное приложение (.NET Framework) для C# или Visual Basic в списке и щелкните Далее.

  3. В диалоговом окне Настроить новый проект в поле Имя проекта введите TypeEquivalenceClient и нажмите кнопку Создать. Проект создан.

  4. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceClient и выберите пункт Свойства.

  5. Выберите элемент Сборка в левой области экрана Свойства и задайте в поле Путь вывода то же расположение, которое использовали для проекта TypeEquivalenceInterface, например, C:\TypeEquivalenceSample.

  6. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceClient и выберите Добавить>Ссылка.

  7. В диалоговом окне Диспетчер ссылок выберите файл TypeEquivalenceInterface.dll, если он уже присутствует в списке. В противном случае выберите Обзор, перейдите к папке пути вывода, выберите файл TypeEquivalenceInterface.dll (а не TypeEquivalenceRuntime.dll) и нажмите кнопку Добавить. Нажмите кнопку ОК.

  8. В обозревателе решений разверните папку Ссылки и выберите ссылку TypeEquivalenceInterface. В области Свойства установите для параметра Внедрить типы взаимодействия значение True.

  9. Откройте файл Program.cs или Module1.vb в редакторе кода и замените его содержимое следующим кодом, чтобы создать клиентскую программу:

    using System;
    using System.Reflection;
    using TypeEquivalenceInterface;
    
    namespace TypeEquivalenceClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly sampleAssembly = Assembly.Load("TypeEquivalenceRuntime");
                ISampleInterface sampleClass =
                    (ISampleInterface)sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass");
                sampleClass.GetUserInput();
                Console.WriteLine(sampleClass.UserInput);
                Console.WriteLine(sampleAssembly.GetName().Version.ToString());
                Console.ReadLine();
            }
        }
    }
    
    Imports System.Reflection
    Imports TypeEquivalenceInterface
    
    Module Module1
    
        Sub Main()
            Dim sampleAssembly = Assembly.Load("TypeEquivalenceRuntime")
            Dim sampleClass As ISampleInterface = CType( _
                sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass"), ISampleInterface)
            sampleClass.GetUserInput()
            Console.WriteLine(sampleClass.UserInput)
            Console.WriteLine(sampleAssembly.GetName().Version)
            Console.ReadLine()
        End Sub
    
    End Module
    
  10. Выберите Файл>Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов и проекта.

  11. Нажмите клавиши CTRL+F5, чтобы собрать и запустить программу. Обратите внимание, что выходные данные консоли возвращают версию сборки 1.0.0.0.

Изменение интерфейса

Теперь измените сборку интерфейса и смените ее версию.

  1. В Visual Studio выберите Файл>Открыть>Проект/решение и откройте проект TypeEquivalenceInterface.

  2. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceInterface и выберите пункт Свойства.

  3. Выберите Приложение в левой области экрана Свойства и элемент Сведения о сборке.

  4. В диалоговом окне Сведения о сборке измените значения Версия сборки и Версия файла на 2.0.0.0 и нажмите кнопку ОК.

  5. Откройте файл SampleInterface.cs или SampleInterface.vb и добавьте в интерфейс ISampleInterface следующую строку кода:

    DateTime GetDate();
    
    Function GetDate() As Date
    
  6. Выберите Файл>Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов и проекта.

  7. В обозревателе решений щелкните правой кнопкой мыши проект TypeEquivalenceInterface и выберите пункт Сборка. Новая версия DLL-файла библиотеки классов компилируется и сохраняется по пути вывода сборки.

Изменение класса среды выполнения

Также измените класс среды выполнения и обновите его версию.

  1. В Visual Studio выберите Файл>Открыть>Проект/решение и откройте проект TypeEquivalenceRuntime.

  2. В обозревателе решений щелкните проект TypeEquivalenceRuntime правой кнопкой мыши и выберите Свойства.

  3. Выберите Приложение в левой области экрана Свойства и элемент Сведения о сборке.

  4. В диалоговом окне Сведения о сборке измените значения Версия сборки и Версия файла на 2.0.0.0 и нажмите кнопку ОК.

  5. Откройте файл SampleClass.cs или SampleClass.vb и добавьте в класс SampleClass следующий код:

     public DateTime GetDate()
     {
         return DateTime.Now;
     }
    
    Public Function GetDate() As DateTime Implements ISampleInterface.GetDate
        Return Now
    End Function
    
  6. Выберите Файл>Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов и проекта.

  7. В обозревателе решений щелкните проект TypeEquivalenceRuntime правой кнопкой мыши и выберите Сборка. Новая версия DLL-файла библиотеки классов компилируется и сохраняется по пути вывода сборки.

Запуск обновленной клиентской программы

Перейдите в папку вывода сборки и запустите TypeEquivalenceClient.exe. Обратите внимание, что выходные данные консоли теперь отражают новую версию сборки TypeEquivalenceRuntime — 2.0.0.0 — без повторной компиляции программы.

См. также