如何在通过C+调用时拆分Dot-Net托管函数+;动态链接库 我从非托管C++代码中探索调用.NET方法,并在中找到了以下函数

如何在通过C+调用时拆分Dot-Net托管函数+;动态链接库 我从非托管C++代码中探索调用.NET方法,并在中找到了以下函数,.net,c++,clr-hosting,.net,C++,Clr Hosting,当在控制台应用程序中调用一次时,这不会有任何问题 我现在想拆分这个函数,以便在dll中使用,从逻辑上讲,它应该分为三个部分 Method - DLLMain DLL_PROCESS_ATTACH Bind to the CLR runtime Push the CLR start button DLL_PROCESS_DETACH Stop the CLR runtime Do not forget to

当在控制台应用程序中调用一次时,这不会有任何问题

我现在想拆分这个函数,以便在dll中使用,从逻辑上讲,它应该分为三个部分

Method - DLLMain
    DLL_PROCESS_ATTACH
         Bind to the CLR runtime
         Push the CLR start button

    DLL_PROCESS_DETACH
         Stop the CLR runtime
         Do not forget to clean up.

Method - CallDotNetToDoSomething

为了实现这一点,我应该如何以及在何处声明ICLRRuntimeHost pClrHost/HRESULT hr?

它们应该是全局(静态)变量,或者是某种类型的单例变量。每个进程只允许有一个.NET运行时(至少现在是这样),因此尝试比这聪明得多没有什么意义。在DLL加载中填充全局变量,然后在DLL卸载期间取消填充


对于我所做的.NET/Mono嵌入项目,我创建了一个对象,其构造函数启动运行时(即绑定/按下启动按钮),其析构函数将其关闭(停止/释放)。这样,主应用程序可以选择如何操作,即将其放在main()中的堆栈上,或者在DLL加载期间执行新的()操作,并在DLL卸载时删除。在这种情况下,您提到的指针将是您创建的新对象的实例变量,例如CLRMembedManager。如果您的库不需要在具有不同行为的不同类型的应用程序中重用,那就太过分了

它们应该是全局(静态)变量,或者是某种类型的单例变量。每个进程只允许有一个.NET运行时(至少现在是这样),因此尝试比这聪明得多没有什么意义。在DLL加载中填充全局变量,然后在DLL卸载期间取消填充


对于我所做的.NET/Mono嵌入项目,我创建了一个对象,其构造函数启动运行时(即绑定/按下启动按钮),其析构函数将其关闭(停止/释放)。这样,主应用程序可以选择如何操作,即将其放在main()中的堆栈上,或者在DLL加载期间执行新的()操作,并在DLL卸载时删除。在这种情况下,您提到的指针将是您创建的新对象的实例变量,例如CLRMembedManager。如果您的库不需要在具有不同行为的不同类型的应用程序中重用,那就太过分了

值得注意的是,从.NET3.5开始,您现在可以在一个进程中(并排)拥有多个.NET运行时。不确定这会如何影响原始海报的问题。值得注意的是,从.NET 3.5开始,您现在可以在一个进程中(并排)有多个.NET运行时。不确定这对原始海报的问题有何影响。
Method - DLLMain
    DLL_PROCESS_ATTACH
         Bind to the CLR runtime
         Push the CLR start button

    DLL_PROCESS_DETACH
         Stop the CLR runtime
         Do not forget to clean up.

Method - CallDotNetToDoSomething