На что может влиять "Enable the Visual Studio hosting process"???
От: mDmitriy Россия  
Дата: 05.01.15 10:32
Оценка:
Всем привет!

Работаю со Scilab, загружаю проект из примеров для NET в VS2012 (4.0, AnyCPU, OS W7 х64), запускаю консольное приложение — все работает.
Вообще пример представляет собой оболочку над бинарными dll Scilab'а, обращения к методам которых происходят через обычный PInvoke.
Как известно, по умолчанию консольные приложения грузятся в VS с установкой UseVSHostingProcess=true (Enable the Visual Studio hosting process).
При снятии этой галочки пример работать перестает.
Причем перестает при попытке передачи строкового параметра в метод — просто беззвучно вылетает с ошибкой 0xc0000409 (неправильный стек) даже под отладчиком.
Это, к счастью, лечится, если явно указать тип маршализации строки, например:
[DllImport(API_SCILAB_DLL, CharSet = CharSet.Ansi)]
public unsafe static extern api_Err getNamedVarDimension([In]IntPtr pvApiCtx, [In] /*[MarshalAs(UnmanagedType.LPWStr)]*/ String _pstName, [Out] Int32* _piRows, [Out] Int32* _piCols);

При раскомментаривании MarshalAs... начинает работать независимо от галочки "Visual Studio hosting process".
Вопросов, собственно, два:
1) Причем тут hosting process???
2) Есть ли другой способ нейтрализовать его влияние?
Спасибо...
Re: На что может влиять "Enable the Visual Studio hosting process"???
От: TK Лес кывт.рф
Дата: 05.01.15 16:25
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>При раскомментаривании MarshalAs... начинает работать независимо от галочки "Visual Studio hosting process".

D>Вопросов, собственно, два:
D>1) Причем тут hosting process???

А причем тут если LPWStr если CharSet.Ansi?

D>2) Есть ли другой способ нейтрализовать его влияние?


Можно вместо String использовать IntPtr. Очевидно у вас бага в декларации — в одном случае повезло и не упало — в другом случае не повезло. Но, не факт что потом падать не начнет.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: На что может влиять "Enable the Visual Studio hosting process"???
От: mDmitriy Россия  
Дата: 05.01.15 17:30
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, mDmitriy, Вы писали:


D>>При раскомментаривании MarshalAs... начинает работать независимо от галочки "Visual Studio hosting process".

D>>Вопросов, собственно, два:
D>>1) Причем тут hosting process???

TK>А причем тут если LPWStr если CharSet.Ansi?

LPWStr потому что х64... Если билдить в х86, то срабатывает LPStr.
CharSet попробую поменять на Unicode.
И да, это не ответ на вопрос о влиянии hosting process.

D>>2) Есть ли другой способ нейтрализовать его влияние?


TK>Можно вместо String использовать IntPtr. Очевидно у вас бага в декларации — в одном случае повезло и не упало — в другом случае не повезло. Но, не факт что потом падать не начнет.

Вряд ли бага, ибо воспроизводимость стабильная для всех методов со строковыми параметрами...
Декларация из поставляемых примеров; впрочем, можно проверить по исходникам на С, они открыты и их есть.
Re[3]: На что может влиять "Enable the Visual Studio hosting process"???
От: icWasya  
Дата: 05.01.15 18:36
Оценка: +2
Здравствуйте, mDmitriy, Вы писали:

D>...


TK>>А причем тут если LPWStr если CharSet.Ansi?

D>LPWStr потому что х64... Если билдить в х86, то срабатывает LPStr.
D>CharSet попробую поменять на Unicode.
D>...
LPWStr и х64 как бы ортогонально
Re[3]: На что может влиять "Enable the Visual Studio hosting process"???
От: TK Лес кывт.рф
Дата: 05.01.15 19:41
Оценка:
Здравствуйте, mDmitriy, Вы писали:

TK>>А причем тут если LPWStr если CharSet.Ansi?

D>LPWStr потому что х64... Если билдить в х86, то срабатывает LPStr.

Разрядность и кодировка вещи ортогональные.

D>И да, это не ответ на вопрос о влиянии hosting process.

D>>>2) Есть ли другой способ нейтрализовать его влияние?
D>Вряд ли бага, ибо воспроизводимость стабильная для всех методов со строковыми параметрами...

Скорее всего проблема в "LPWStr потому что гладиолус"
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.