Я пишу расширения для программы на C++. Я пишу стандартные C/C++ dlls, и я использую IJW для вызова C# dll. Это всегда работало отлично, пока я не написал и не назвал C# dll, который, в свою очередь, называется OpenFileDialog и SaveFileDialog. Всякий раз, когда вызывался с ShowDialog, приложение замерзало.C++/cli -> вызов C# dll -> вызов проблемы OpenFileDialog
Так делая «Минимальный Рабочий пример» Я получил: Необработанное исключение типа «System.Threading.ThreadStateException» произошло в System.Windows.Forms.dll
Дополнительная информация: Текущий поток должен быть установите режим однопоточной квартиры (STA) до того, как вызовы OLE могут быть сделаны. Убедитесь, что ваша основная функция имеет STAThreadAttribute, отмеченный на нем. Это исключение возникает только в том случае, если к процессу прикреплен отладчик.
Итак, я попытался добавить атрибут STAThread infront основного в моем «Минимальном рабочем примере», и я получил эту ошибку.
ошибка C2337: 'STAThread': атрибут не найден
Итак, два вопроса:
- Как d0 я получаю "Минимальный рабочий пример" работает и
- Как Я получаю настоящее приложение?
(это даже можно добавить атрибут STAThread в неуправляемый блоке #pragma?)
#pragma unmanaged
BOOL WINAPI DllMain (HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved)
{
...
}
Гораздо лучший ответ, чем мой. –
Для меня с WPF вместо WinForms аналогичная проблема была решена путем вызова CoInitialize (NULL) в основной функции. В этом случае начало новой нити не было необходимым (и обычно не желательно), тоже –