Когда релиз DLL не работает, но отладка DLL - PullRequest
16 голосов
/ 15 декабря 2008

После развертывания нашей огромной распределенной системы на одном из наших клиентов мы столкнулись с неожиданной ошибкой. В ходе расследования мы заменяем сборку, вызвавшую ошибку, на ту, в которую мы добавили некоторый диагностический код. Используемая нами dll встроена в режим отладки. И вдруг все работает!

Замена dll отладки на версию выпуска (с диагностическим кодом) снова приводит к сбою.

В нашем коде нет директив прекомпилятора, атрибутов условной отладки и т. Д. Проблема была обнаружена в двух разных местах установки, а в нескольких других она работает нормально.

(В проекте есть смесь C # и VB.NET, проблемная сборка VB.NET .., если это имеет какое-то значение)

Итак, вопрос: Что вы делаете в подобных ситуациях? И в чем может быть причина - в целом? Любые советы по устранению этой проблемы приветствуются.

Ответы [ 15 ]

0 голосов
/ 25 октября 2018

Это, вероятно, не относится к исходному вопросу, но для тех, кто запускает приложение, использующее

var isThisMyAssembly = System.Reflection.Assembly.GetCallingAssembly();

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

Чтобы избежать этого, вы можете применить MethodImplAttribute к вашему методу:

[MethodImpl(MethodImplOptions.NoInlining)]
void DoSomeThings()
{
    var isThisMyAssembly = System.Reflection.Assembly.GetCallingAssembly();
    //do stuff
}

или вместо него можно перейти на Assembly.GetExecutingAssembly().

0 голосов
/ 29 сентября 2017

В моем случае, мой потребительский проект DLL (в VS) имел конфигурацию x64, но решение было в любом процессоре. По какой-то причине при запуске приложения это не связано с моей x64 DLL. Я настроил приложение для платформы x64 явно, и все работало правильно.

0 голосов
/ 06 сентября 2011

Вы решили свою проблему?
У меня та же проблема, что и у вас.
Если я скомпилирую dll в отладке, все работает нормально.
Если я компилирую в релизе, я получаю исключение нулевой ссылки.
Но если я включу некоторые строки, подобные приведенной выше, в вызов некоторых методов, исключение исчезнет даже в режиме выпуска:
System.Diagnostics.EventLog.WriteEntry ("блаблабла", "блаблабла")

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

0 голосов
/ 15 июля 2009

У меня была похожая проблема. Моя ситуация такова: Я определил некоторые функции отражения в библиотеке классов A. Затем я определил библиотеку пользовательских элементов управления WPF B, которая использует функции из библиотеки A. Затем я написал приложение, которое использует пользовательский элемент управления из библиотеки B и функции в библиотеке A. Когда я Использовал отладочную версию библиотеки B, все отлично работает. Но когда я использовал версию библиотеки B, функции отражения не работали. Я также определил другие функции в библиотеке А. Кажется, что только функции отражения вызывают проблемы. Я не могу понять причину. Наконец, я сдался и переместил функции отражения из библиотеки A в библиотеку B. И это сработало.

0 голосов
/ 14 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...