Подтвердить что ты не робот

Тип существует в 2 сборках

Я создал две сборки .NET Interop из двух различных COM-DLL сторонних производителей. Обе библиотеки COM DLL содержат тип с именем COMMONTYPE. Поэтому COMMONTYPE теперь также отображается через две сборки Interop.

У меня есть третий проект, который должен использовать эти две сборки Interop, и я получаю печально известную ошибку времени компиляции:

Тип <ABC> существует как в <ASSEMBLY1.dll>, так и <ASSEMBLY2.dll>

Поскольку COM-библиотеки DLL предоставляются сторонним поставщиком, у меня нет доступа к исходному коду, и я пишу приложение С# Console, что означает, что у меня нет файла web.config, где я мог бы добавить debug=false обходной путь. Что я могу сделать?

4b9b3361

Ответ 1

Я знаю, что это старо, но есть более простой способ, чем перечисленные. Это работает, когда вы ссылаетесь на две сборки, которые совместно используют типы с точным тем же именем и пространством имен.

Если вы щелкните правой кнопкой мыши ссылку на свою DLL и выберите "Проперии", вы увидите, что здесь свойство "Псевдонимы"

введите описание изображения здесь

Значение по умолчанию "глобальное" . Для одной из конфликтующих сборок измените это на любое другое значение. В приведенном ниже примере я изменил его с "global" на "destination".

Далее, в вашем файле кода вам нужно будет использовать ключевое слово extern, чтобы использовать этот псевдоним в качестве пространства имен корневого уровня для этих типов, В этом примере вы должны поместить следующее вверху вашего файла .cs:

extern alias destination

Теперь в этом файле вы можете ссылаться на оба типа.

extern alias destination;
namespace Test
{
    public static class TestClass
    {
        public static void Success()
        {
            var foo = destination::Some.Duplicate.Namespace.SomeDuplicateType();
            var bar = Some.Duplicate.Namespace.SomeDuplicateType();
        }
    }
}

Ответ 2

Если пространства имен поставщиков идентичны (маловероятно), определения типов фактически будут раздельными в этой точке. То, что вам нужно будет делать (и это полный PITA иногда), создает псевдоним пространства имен в вашем операторе using, а не просто применяет операторский бланш. Это позволит вам повторно идентифицировать пространства имен:

using Vendor1 = Vendor.Namespace;
using Vendor2 = OtherVendor.Namespace;

...

Vendor1.COMMONTYPE blah = new Vendor1.COMMONTYPE();
Vendor2.COMMONTYPE blah2 = new Vendor2.COMMONTYPE();

Это будет означать использование конкретного псевдонима для всех типов, расположенных в каждом пространстве имен для этих поставщиков.

Ответ 3

Старый вопрос, но нашел более простой вариант... Выберите ссылку, которую вы хотите использовать... В свойствах измените псевдонимы на "xyz" Теперь в строке кода вверху добавить:

extern alias xyz;

затем добавьте с помощью:

using xyz.VENDOR2.Type;

или другой способ использования с помощью:

using OtherNameSpace = xyz.VENDOR2.Type;

теперь вы можете использовать ссылку, как показано ниже:

var abc = new xyz.VENDOR2.Type.abc();

или

var abc = new OtherNameSpace.abc();

Ответ 4

вы можете использовать псевдонимы для разных пространств имен и/или типов:

вот как это будет выглядеть:

using other = sssssss.a;
namespace ConsoleApplication1
{
    public class a 
    {
        public string ff { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            other s = new other();
            a b = new a();
        }
    }
}
namespace sssssss 
{

    public class a
    {
        public string ff { get; set; }
    }
}

MSDN

Ответ 5

Возможно, вы можете обмануть его, изменив namespace одной из сборок, в этом случае полное имя одного COMMONTYPE не будет равно другому, и, возможно, оно может решить вашу проблему с конфликтом, возникающим в 3-ей DLL.

Надеюсь, что это поможет.