две разные библиотеки DLL с одинаковым пространством имен



У меня есть два DLL-файла, которые имеют одинаковое пространство имен, но они имеют разные методы и типы.
Как я могу ссылаться на обе библиотеки DLL в моем проекте и использовать их методы и типы?



кстати, эти две библиотеки DLL имеют некоторые методы и типы с одинаковым именем, но разные реализации и некоторые уникальные методы и типы.

811   3  

3 ответов:

нет ничего специального, что вам нужно сделать - просто ссылаться на них и использовать типы. Пространства имен могут охватывать несколько сборок без проблем, потому что они не являются действительно непрозрачными типами. Пространство имен-это просто способ добавления общего префикса ко всем типам, которые оно содержит, что позволяет вам иметь несколько типов одного и того же имени в разных пространствах имен. (Фреймворк не видит их как имеющие одинаковые имена, потому что он видит "полное" имя всего, что имеет псевдоним и пространство имен, прикрепленное к передней его части.)

В редких случаях, когда вы ссылаетесь на 2 сборки, которые имеют те же имена типа и те же пространства имен (например, 2 разные версии одной и той же dll) - вы можете различать, какую сборку использовать для данного типа, используя псевдоним. Псевдоним по умолчанию для всех ссылок global, но вы можете указать свой собственный псевдоним для любой сборки, когда вы ссылаетесь на нее (используя переключатель компилятора - или просто используйте поле свойств в Visual Studio) - и есть extern alias <name> предложение в верхней части файла кода, где вы его используете - вы бы получить доступ к типам из разных сборок с <name>::MyNamespace.Type

если у вас есть 2 типа с точно таким же именем (обратите внимание, что имя включает пространство имен), но в разных библиотеках DLL, и вы заинтересованы в использовании обоих из них, то вы можете сделать это.

Короткий Ответ:

у вас типа Acme.Foo в 2 разных DLL, и вы хотите их использовать. Дайте ссылке псевдоним в окне Свойства ссылки (окно вид | свойства), а затем используйте его следующим образом:

extern alias TheAliasYouGaveTheReference

TheAliasYouGaveTheReference::Acme.Foo f = new 
    TheAliasYouGaveTheReference::Acme.Foo();

пространство имен по умолчанию global для любой программы на C# но, обратите внимание, что мы используем псевдоним, который мы создали вместо global.

лучший подход-это не в первую очередь, если обе сборки являются вашими собственными, то не создавайте 2 типа с одинаковым именем в одном и том же пространстве имен. Но иногда мы не контролируем исходный код, поэтому для тех времен можно использовать вышеуказанное решение.

долго Ответ

я копирую большую часть статьи здесь так это записано здесь, в случае, если статья более не доступна.

как вы попадаете в такую ситуацию?

во-первых, вот как вы можете повторить сценарий, так что очень понятно, о чем мы говорим:

  1. создайте библиотеку классов C# с именем FooVersion1
  2. заменить код шаблона в Класс1.cs со следующим:

    using System;
    
    namespace Acme
    {
        public class Foo
        {
            public void Bar()
            {
                Console.WriteLine("Bar");
            }
        }
    }
    
  3. Правой Кнопкой Мыши решение в обозревателе решений и выберите Добавить | новый проект

  4. сохранить текущий проект (применимо только в express)
  5. выберите библиотеку классов в диалоговом окне новый проект и измените имя проекта на FooVersion2 и нажмите OK
  6. замените код в файл Class1.cs с помощью следующее:

    using System;
    
    namespace Acme
    {
        public class Foo
        {
            public void Bar()
            {
                Console.WriteLine("Bar");
            }
    
            public void Goo()
            {
                Console.WriteLine("Goo");
            }
        }
    }
    

использование типа в приложении

Итак, теперь у нас есть 2 разных сборки, содержащие Acme.Foo. Теперь давайте создадим консольное приложение и попробуем использовать каждое из них.

  1. Правой Кнопкой Мыши решение в обозревателе решений и выберите Добавить | новый проект
  2. выберите консольное приложение и назовите его Consumer
  3. щелкните правой кнопкой мыши на потребителе и выберите " Установить как запуск проект’
  4. щелкните правой кнопкой мыши на узле ссылки в проекте потребителя и выберите "Добавить ссылку"
  5. перейдите на вкладку Проекты и выберите несколько вариантов FooVersion1 и FooVersion2 Нажмите кнопку ОК
  6. добавить следующую строку в Main в типе программы потребительского проекта:

    Acme.Foo f = new Acme.Foo();
    

построить решение с помощью Ctrl + Shift+B (или F6) Обратите внимание, что вы получаете две ошибки сборки [как показано ниже]:

enter image description here

Исправления

вот как мы можем это исправить:

  1. откройте обозреватель решений и выберите FooVersion1 в папке References проекта-потребителя
  2. нажмите F4 (или выберите Вид | Окно свойств)
  3. измените свойство Aliases на FooVersion1
  4. построить решение
  5. теперь все будет строиться правильно, потому что Acme.Foo однозначно относится к FooVersion2
  6. добавьте следующую директиву в верхнюю часть программы.cs в потребительском проекте:

    extern alias FooVersion1;
    
  7. изменить использование Acme.Фу то:

    FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
    f.Bar();
    
  8. обратите внимание, что при вводе ‘f.’ список завершения содержит только те методы в FooVersion1 Acme.Foo (в частности, он не включает Goo)

  9. построить решение, и все будет строить правильно
  10. наконец, добавьте следующий код под f. Bar () в программе.КС потребительского проекта:

    Acme.Foo f2 = new Acme.Foo();
    f2.Goo();
    
  11. обратите внимание, что список завершения f2 содержит Goo.

  12. построить снова с помощью Ctrl + Shift+B и обратите внимание, что по-прежнему нет ошибок сборки

вы можете использовать функцию псевдонима параметра компилятора /reference (Import Metadata) (C# Compiler Options) для решения ваших проблем, читать из здесь для более подробной информации

Comments

    Ничего не найдено.