gpt4 book ai didi

c# - 托管应用程序的 CoInitializeSecurity,创建垫片?

转载 作者:行者123 更新时间:2023-11-30 23:05:52 28 4
gpt4 key购买 nike

我目前正在研究将 com+ 安全上下文设置为的问题:托管 winforms 进程的无。

在 .NET 中,不可能将 CoInitializeSecurity 设置为 Main 之后代码的第一行,为时已晚。据我了解,该方法已由 CLR 调用。

在下面的链接中: http://www.pinvoke.net/default.aspx/ole32.coinitializesecurity

是这样写的:

"The workaround is to write an unmanaged "shim" that will call CoInitializeSecurity, then activate and call into managed code. You can do this via an export from a mixed-mode C++ DLL, by registering a managed component for use by COM, or by using the CLR hosting API."

有人可以阐明这一点吗?应该如何用非托管代码编写(语言无关紧要)

托管应用程序不时调用 com+ 服务器,但我没有看到我应该立即激活界面以通过的任何原因指向托管代码的指针?

最佳答案

The workaround is to write an unmanaged "shim" that will call CoInitializeSecurity, then activate and call into managed code. You can do this via an export from a mixed-mode C++ DLL, by registering a managed component for use by COM, or by using the CLR hosting API.

这意味着您在 c/c++ 中创建了一个非常小的 native .exe(“Shim”)调用 CoInitializeEx(),然后调用 CoInitializeSecurity 作为为整个 Windows 进程建立 COM 安全环境的方法。

 ----------------------------------
| 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();
}

有了它,下一个技巧就是从 c/c++ 调用您的 .NET 代码。此处最简单的做法是创建一个 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
}
}

您需要将代码从您的 c# .exe 项目移动到新的 c# 程序集/库中。正是这个库将公开将从您的 c/c++ 应用程序调用的 COM 可见类。 (尽管 c/c++ 应用程序不关心它是在 COM exe 还是 dll 中,对于本练习,您不想通过尝试将另一个 .exe 加载到已经运行的 Windows 进程中来混淆问题)

消息泵和对话框

我通过将主窗口设为模态对话框来简化这里的操作。模态对话框有自己的 Windows 消息泵处理,我们通过将您的表单代码放入 dll 并丢弃原始程序的 Main() 方法和 Application.Run 的优点来删除这些内容(new MainForm());.

告诉我更多

关于c# - 托管应用程序的 CoInitializeSecurity,创建垫片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48544372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com