COM Interop Side-боковые узлы
Вопрос
Мне нужно развернуть несколько версий одного и того же проекта C # .NET. Вывод проекта - это сборка COM-интерфейса, которая будет использоваться в собственном приложении. Проблема у меня есть, это то, что я должен развернуть несколько версий этой сборочной стороной, но все, что мне делать, не создает разных версий. Вместо этого версии переопределяют друг друга.
Я попытался изменять GUID GUID, попробовал изменение номеров версий сборки, попытался восстановить клавишу «Сборка балла», попробовал изменение заголовка и описания сборки. Я бы предпочел не нужно менять GUID или имена для отдельных типов в сборке для целей версий.
Как я могу убедиться, что эти версии не переопределяют друг друга и что я вижу и развернут их рядом?
Заранее спасибо!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace InteropTest
{
[Guid("...")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Test
{
public Test()
{
}
public string Version
{
get
{
return "1.0";
}
}
}
}
Решение
Я бы предпочел не нужно менять GUID или имена для отдельных типов в сборке для целей версий.
Но это точно Что вы должны сделать, чтобы предотвратить вмешательство COM-типов друг с другом. [GUID] используется для выбора ключа реестра в HKLM Software Classes CLSID, где зарегистрирован COM-класс. Две разные версии с тем же GUID будут перезаписать все другие ключи. В противном случае известен как DLL ад. Изменение общедоступного интерфейса требует Новый GUID для обеспечения того, чтобы клиенты, которые используют старый, не умирают с невозможным диагностики плохого поведения. Потрясающий компетенция.
Опуская атрибут [GUID] очень возможен, вы сейчас оставьте его в CLR для создания одного для вас. Теперь атрибуты сборки начинают воспроизводить роль, значение GUID является автоматически генерируется алгоритмом Slick, который включает в себя имя сборки и версию, а также набор методов на интерфейсе и их аргументы. Таким образом, обеспечивая это Любые Изменения автоматически производят другой GUID. И, как и ожидалось, и требуется, другой [Assockerversion] будет генерировать другой [GUID].
Другой подход, который является то, что я предполагал, что вы имели в виду с «бок о бок», должен нет Зарегистрируйте сборку, но вместо этого полагайтесь на проявление. Он должен быть встроен в клиентскую программу, вы используете <clrClass>
элемент, чтобы объявить ваш [Comisible] класс. Версификация теперь становится деталей развертывания. MSDN How-to здесь. Отказ Имейте в виду, что он должен быть встроен в клиент Программа, а не ваша [неизбежная] сборка. Это имеет тенденцию быть проблемой.
Другие советы
Попробуйте поздние привязки к вспомогательной сборке в вашей собственной приложении, если вы можете. Я также советую к автоматическому генерации интерфейса с использованием Autodual и вместо этого явно создавая собственное чтение это для получения дополнительной информации. Вы можете устранить проблему, открывая REGEDIT и поиск GUID и Progid, чтобы увидеть, какие версии сборки были зарегистрированы.