Разница в поведении компонентов.NET при изменении конфигурации компиляции
У меня проблемы с куском кода, который ведет себя по-разному в зависимости от того, был ли он скомпилирован в конфигурации Release или Debug в Visual Studio. Я вручную изменил все параметры компиляции проекта, которые я вижу в конфигурации выпуска, чтобы она соответствовала настройке отладки, но проблема сохраняется.
Код (ниже) возвращает Guid исполняемой сборки:
private static Guid GetApplicationUid()
{
Assembly assembly = Assembly.GetCallingAssembly();
GuidAttribute attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), false)[0];
return new Guid(attribute.Value);
}
Метод завершается с ошибкой "Индекс был за пределами массива". исключение при выполнении после компиляции в режиме Release. Он работает правильно в режиме отладки. Причина в том, что в этой конфигурации ссылка на сборку, созданная GetExecutingAssembly(), относится к временной сборке (например, App_Web_eelfd0ff, Version=0.0.0.0, Culture= нейтральный, PublicKeyToken=null), а не к базовой "реальной".
Как ни странно, у меня есть другой компонент, работающий в той же сети, который использует тот же код и ведет себя одинаково независимо от режима компиляции.
Почему это происходит и как это предотвратить?
2 ответа
Возможно, что когда оптимизация включена, функция встроена в другую сборку. Попробуйте добавить MethodImplOptions.NoInlining
, согласно этому ответу, так что метод находится в сборке, вы думаете, что это так.
Исключение означает, что сборка не имеет атрибута GUID. Предполагается, что он может быть оптимизирован компилятором в режиме выпуска, если сборка не настроена на видимость COM1. Проверьте другую рабочую сборку, чтобы узнать , зарегистрирована ли она для COM-взаимодействия.
1 GUID используются только в сборках.NET для взаимодействия COM. Visual Studio автоматически добавляет GUID для вас при создании нового проекта на случай, если вы хотите сделать COM-взаимодействие, но в противном случае это бесполезно.