Обходной путь — написать неуправляемую «прокладку», которая будет вызывать CoInitializeSecurity, а затем активировать и вызывать управляемый код. Это можно сделать с помощью экспорта из библиотеки DLL C++ смешанного режима, путем регистрации управляемого компонента для использования COM или с помощью API размещения CLR.
Это означает, что вы создаете очень маленький собственный .exe ("Shim"), скажем, на c/c++, который вызывает CoInitializeEx()
, за которым следует вызов CoInitializeSecurity
, как способ установить среду безопасности COM для всего Процесс Windows.
----------------------------------
| Windows Process |
| ----------- ---------- |
| | exe | COM | dll | |
| | "Shim" | ====> | | |
| | (c/c++) | | c# | |
| ----------- ---------- |
-----------------------------------
Код:
// pseudo c++ code
.
.
.
int main (int argc, char* argv)
{
CoInitializeEx(...);
CoInitializeSecurity(...);
IMyContractPtr pFoo (__uuidof (MyClass));
pFoo->RunMe();
CoUnitialize();
}
После этого следующий трюк заключается в вызове кода .NET из c/c++. Здесь проще всего создать класс ComVisible(True)
c#, предоставить метод COM, скажем, RunMe()
, который при вызове отображает вашу форму WinForms.
public interface IMyContractPtr
{
void RunMe();
}
[ComVisible(true)] // there are cleaner ways to expose COM-visible
public class MyClass : IMyContractPtr
{
public void RunMe()
{
var form = new MainForm();
form.ShowDialog(); // example
}
}
Вам нужно будет переместить свой код из проекта С# .exe в новую сборку/библиотеку С#. Именно эта библиотека будет предоставлять COM-видимый класс, который будет вызываться из вашего приложения c/c++. (хотя приложению c/c++ все равно, находится ли оно в COM-exe или dll, для этого упражнения вы не хотите запутать проблему, пытаясь загрузить другой .exe в уже запущенный процесс Windows)
Насосы сообщений и диалоги
Я немного упростил здесь, сделав главное окно модальным диалогом. Модальные диалоги имеют свою собственную обработку Windows Message Pump, которую мы убрали, поместив код вашей формы в dll и отказавшись от метода Main()
вашей исходной программы и того добра, которое есть Application.Run(new MainForm());
.
Расскажи мне больше
person
MickyD
schedule
31.01.2018
implicitly call
CoInitializeSecurity, если он еще не был вызван... - это неверно в предоставленной ссылке. Пожалуйста, обратитесь к документу MSDN, а также к заголовку stackoverflow.com/questions/30560589/ - person MickyD   schedule 31.01.2018