Попытаюсь сформулировать кратко:
1) есть проект на с++ (состоит из кучи lib-ов)
2) для основных классов этого проекта есть вреппер на <managed + unmanaged> с++ (как .lib).
3) для тестов была написана библиотека на с++ (как .lib).
4) для нее была написана библиотека- врепер на managed с++ (раз как dll). Она использует нашу либу 2)
5) есть тест на с# (под nunit)
6) для теста написана вспомогательная библиотека, опирающаяся на 4) (как dll).
7) В самом тесте есть переменная типа 6):
private Managed_HelpLib m_helpLib = null;
в конструкторе я создаю объект:
myTest()
{
m_helpLib = new Managed_HelpLib(15);
}
Во всех предыдущих версиях все было прекрасно, пока народ не создал текущую... Изменений куча, проследить за всеми невозможно.
Результат - после старта теста при попадании в вышеописанный конструктор я получила сообщение:
Managed Debugging Assistant 'LoaderLock' has detected a problem in 'D:\...\NUnit 2.4.1\bin\nunit.exe'.
Additional Information: DLL 'C:\Documents and Settings\teir\Local Settings\Temp\nunit20\ShadowCopyCache\4100_633954630511655168\Tests\assembly\dl3\7cdc7536\a98903d8_4074ca01\OMSp_mbt_managed.DLL' is attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.
После того, что я, невзирая на это, решила идти дальше, получила следующее уведомление:
Test.OMSp_managed_DistributionTest.C_SmokeTest (TestFixtureSetUp) :
System.IO.FileLoadException : Could not load file or assembly 'OMSp_mbt_managed, Version=30.3005.2.1, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
Exception from HRESULT: 0xE0434F4D
----> System.Runtime.InteropServices.COMException : Exception from HRESULT: 0xE0434F4D
где:
- Test.OMSp_managed_DistributionTest.C_SmokeTest (TestFixtureSetUp) - мой тест
- OMSp_mbt_managed.DLL - это наша 4)
На всякий случай быстро сварганила примерчик-подобие своего теста, чтобы попытаться отловить ошибку конкретней, после чего эти сообщения приобрели чуть больше конкретики
- первое:
LoaderLock was detected
Message: DLL 'D:\Views\....\bin\Debug\OMSp_mbt_managed.dll' is attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.
- второе:
System.IO.FileLoadException was unhandled
Message="Could not load file or assembly 'OMSp_mbt_managed, Version=30.3005.2.1, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Exception from HRESULT: 0xE0434F4D"
Source="ClassLibrary2_hlp"
FileName="OMSp_mbt_managed, Version=30.3005.2.1, Culture=neutral, PublicKeyToken=null"
FusionLog=""
StackTrace:
at ClassLibrary2_hlp.Class1_hlp..ctor(Int32 nTestCount)
at ClassLibrary1.Class1..ctor() in D:\Views\adteir0.omsp.ap.adteir0_300614\s7p.omsp\oms\test\ClassLibrary1\ClassLibrary1\Class1.cs:line 19
at ConsoleApplication1.Program.Main(String[] args) in D:\Views\adteir0.omsp.ap.adteir0_300614\s7p.omsp\oms\test\ClassLibrary1\ConsoleApplication1\Program.cs:line 15
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Начала искать решение...
1) Попыталась убирать по очереди изменения, но вскоре бросила, ибо их оказалось слишком много.
2) В инете нашла совет просто отключить данное сообщение и все будет хорошо.
Отключила (debud->ehsceptions->managed debugging assistant -> LoaderLock - убрать птичку), но мне это не помогло, ибо второе сообщение все равно появлялось с завидным постоянством, чего и следовало ожидать
3) потом нашла некое логичное объяснение и совет, выполнила:
в нашей библиотеке 2а) в "properties -> linker -> advanced" для пункта "no entry point" выбрала "yes" и перекомпилировала.
После чего стартовала свой тест.
После старта прошла немного дальше, но именно немного... Далее все равно возникает ошибка при первой же попытке обратиться к моей переменной...
Итого, насколько я все-таки что-то понимаю в колбасных обрезках, библиотека таки нездорова.
Вопросов несколько:
- сталкивался ли кто-то с подобной ситуацией
- может кто-то знает, как это лечится
- самый простой - как проверить, здоров ли assembly нашей библиотеки
- можно ли вообще проверить (и если да, то как), какие из ее составляющих загружены, а какие нет