Тип существует в 2 сборках
Я создал две сборки .NET Interop из двух различных COM-DLL сторонних производителей. Обе библиотеки COM DLL содержат тип с именем COMMONTYPE
. Поэтому COMMONTYPE
теперь также отображается через две сборки Interop.
У меня есть третий проект, который должен использовать эти две сборки Interop, и я получаю печально известную ошибку времени компиляции:
Тип <ABC>
существует как в <ASSEMBLY1.dll>
, так и <ASSEMBLY2.dll>
Поскольку COM-библиотеки DLL предоставляются сторонним поставщиком, у меня нет доступа к исходному коду, и я пишу приложение С# Console, что означает, что у меня нет файла web.config, где я мог бы добавить debug=false
обходной путь. Что я могу сделать?
Ответы
Ответ 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.
Надеюсь, что это поможет.