Это используется в стеке unwiding таблицы, которые Вы видите, например, в выводе блока мой ответ на другой вопрос . Как упомянуто на том ответе, его использование определяется C++ ABI Itanium, где это называют Стандартная программа Личности .
причина это "работает" путем определения его, как глобальный ПУСТОЙ пустой указатель, вероятно, потому что ничто не выдает исключение. Когда что-то попытается выдать исключение, тогда Вы будете видеть, что он неправильно себя ведет.
, Конечно, если ничто не использует исключения, можно отключить их с -fno-exceptions
(и если ничто не использует RTTI, можно также добавить -fno-rtti
). При использовании их Вы имеете к (как другие ответы, уже отмеченные) ссылка с g++
вместо gcc
, который добавит -lstdc++
для Вас.
В блоге NUnit объясняется, почему файлы конфигурации загружаются именно так. В основном они сказали, что NUnit позволяет фреймворку обрабатывать файлы конфигурации и не выполняет никакого управления.
Вы также можете использовать файл testProject.config
, который будет загружен в вашем случае, для ссылки на файлы конфигурации для каждой из сборок. Использование атрибута файла appSettings для добавления ключей.
Последняя альтернатива - использовать атрибут элемента configSource
, чтобы использовать раздел в одном из файлов конфигурации сборок.
Надеюсь, это поможет.
Решение configSource
element , данное MarkLawrence , - это то, что я искал, и оно прекрасно работает. Однако проблема при реализации этого решения состоит в том, чтобы загрузить конфигурацию сборки при запуске тестов как из явного проекта NUnit (как в в моем случае ), так и при выполнении модульных тестов для изолированной сборки (нет явный проект). Для этого потребовались следующие изменения в макете моего файла:
+ TestFolder
testProject.nunit
testProject.config
+ AssemblyAFolder
assemblyA.dll
assemblyA.dll.config
assemblyA.dll.configfragment
+ AssemblyBFolder
assemblyB.dll
assemblyB.dll.config
assemblyB.dll.configfragment
Файлы configfragment
созданы для хранения конфигурации сборки, которая когда-то была в соответствующих файлах config
. Впоследствии файлы config
изменены, чтобы содержать только элемент configSource
с относительным путем к соответствующему файлу configfragment
. Обратите внимание, что этот подход не работает только тогда, когда assemblyA.dll
и assemblyB.dll
требуется один и тот же раздел конфигурации, поскольку при создании возникнет конфликт. testproject.config
.
После экспериментов с этим подходом я решил полагаться на создание конфигурации сборки во время выполнения и удалить все файлы статической конфигурации. Вот код, который демонстрирует, как сгенерировать конфигурацию и сделать ее доступной независимо от того, как загружена тестируемая сборка.
void WithConfigurationFile(Action method)
{
// Create the assembly configuration.
string settingsSection = "myConfigSectionName";
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add(
settingsSection,
new ConfigSectionType(/*config element values*/);
config.Save();
try
{
// Invoke the method with the new configuration.
ConfigurationManager.RefreshSection(settingsSection);
method();
}
finally
{
// Revert the assembly configuration.
File.Delete(config.FilePath);
ConfigurationManager.RefreshSection(settingsSection);
}
}
С помощью ConfigurationManager. OpenExeConfiguration () перегрузка, которая не принимает путь, мы загружаем конфигурацию из рабочего каталога хост-приложения, который изменяется в зависимости от того, как вы запускаете тесты NUnit. Кроме того, блок try / finally гарантирует, что ваша конфигурация сборки не будет мешать другим тестам, которые могут требовать или не требовать такой конфигурации.
Наконец, для использования в модульном тесте:
[Test]
void VerifyFunctionality
{
WithConfigurationFile(delegate
{
// implement unit test and assertions here
});
}
Я надеюсь, что это поможет другим, которые могут сталкивались с похожими проблемами!
Используйте атрибут configfile на уровне конфигурации в вашем файле .nunit:
<Config name="Debug" configfile="myconfigfilenamegoeshere.config />