问题标签 [clr-hosting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2112 浏览

c++ - 允许托管环境中的托管代码回调非托管代码

我有托管 clr 的 C++ 代码,以便使用用 c# 编写的 Managed.dll。

这个 .net 有一个类似下面的方法,它允许代码注册事件通知:

界面看起来像这样

我想在程序的 C++ 部分做一些事情,由 .net 世界中的事件触发。如果有必要,我什至不介意为了使 Managed.dll 对 C++ 更友好而创建另一个托管 dll。

我在这里有什么选择?我确信我可以实现的唯一一个是:

  • 编写另一个托管 dll 来监听这些事件,将它们排队并让 C++ 代码通过轮询访问队列

这当然会从“中断”样式变为“轮询”样式,具有所有优点和缺点以及提供排队的需要。我们可以不进行轮询吗?我可以以某种方式调用托管代码并为其提供一个指向 C++ 世界的函数指针作为参数吗?

更新 感谢 stijn 的回答和评论,我希望我朝着正确的方向前进了一点,但我想仍然存在的主要问题是如何将 fn 指针从非托管土地传递到 clr 托管环境。

假设我有一个“int fn(int)”类型的函数指针,我想传递给托管世界,以下是相关部分:

托管代码(C++/CLI)

非托管代码

调用将spType->InvokeMember_3导致0x80131512结果。

我将指向 NativeFun 的指针传递给托管世界的方式似乎有问题,或者我的函数是如何定义的。当使用 String^ 参数而不是 fn ptr 时,我可以成功调用 CLR 函数。

0 投票
1 回答
757 浏览

c# - CLR 的类加载服务

我从谷歌阅读主题,我明白这一点:

  1. Windows 加载程序加载 .net 应用程序的 exe 或 dll。
  2. 然后 Windows 加载程序为该进程创建 clr。
  3. 然后它找到应用程序的入口点并调用它。
  4. 但是在 clr 的类加载器服务来加载包含 Main 方法的类之前。
  5. 然后进行 jit 编译。
  6. clr 向我们的应用程序提供诸如 gc、异常处理、类加载等服务。

我的问题是:

现在,当我们运行 .net app 时,clr 会找到入口点并开始执行。但是当它遇到

那个时候我们的进程如何调用CLR的服务,称为类加载器?MSIL 代码相当于是 newobj 在内部调用 clr 的类加载器服务吗?

0 投票
1 回答
1941 浏览

c# - 在 C++ 中托管 CLR 运行时

我正在为一个项目进行扩展,该项目将允许在核心应用程序中托管 CLR。有了这个,我计划允许这个扩展管理它在自身内部加载/卸载的托管扩展。话虽如此,我需要使用单独的 AppDomain 来确保可以卸载。

目前,我能够设置域并加载插件文件,但此时我被卡住了。我不确定如何随意调用域加载程序集内的函数等等。

到目前为止,这是我的加载设置,减去错误检查等:

我有一个类库,所有插件都必须引用和使用它才能被视为插件。到目前为止,它只不过是一个要继承的基类:

然后扩展将引用该类库并将其用作其基础:

我坚持的是如何做几件事:

  • 我怎样才能获得主类,但作为基础来调用允许主类仍然处理的基础中的方法?
  • 如何确保主类继承基类,以便确保它是有效的插件文件?
  • 如何从 C++ 端自由调用方法来触发 C# 插件中的事件。

对于触发事件,C++插件一旦加载就会调用C#插件中更多的东西,比如渲染事件、命令处理等。

我在网上找到的大多数示例都特定于要求整个 C# 端都是静态的,这是我不想要的。此外,大多数不使用单独的 AppDomain,而是默认执行。我不想要这个,因为它限制了卸载特定插件的能力。

如果缺少任何其他信息并且需要,请随时告诉我。

0 投票
1 回答
153 浏览

c++ - 我是否需要释放由 _Type::get_FullName 填充的 BSTR

我有一些看起来像这样的代码:

我需要释放那个 bstr 吗?如何释放它SysFreeString()?如果不是为什么?

0 投票
1 回答
384 浏览

.net - 通过 ICorRuntimeHost 访问 AppDomain

我需要枚举加载到 CLR 中的 AppDomain。但我需要从非托管代码(在 C++ 中)中做到这一点。我想,我应该使用 ICorRuntimeHost。它包含 AppDomains 枚举的方法。ICorRuntimeHost::NextDomain 返回当前 AppDomain 的 IUnknown*。在我的代码中不启用 CLR 支持的情况下,我需要使用哪个接口来访问此 AppDomain ?

0 投票
2 回答
886 浏览

.net - CLR 托管。如何在 .net 4 中枚举 _AppDomains

我有用 C 编写的非托管 dll,它将被注入到托管应用程序(dotNet 4)中。我将枚举_AppDomains,在此应用程序中运行以将某些模块加载到域中。可以使用ICorRuntimeHost界面来执行此操作。但是,ICorRuntimeHost已弃用,并且(如http://msdn.microsoft.com/en-en/library/ms164320%28v=vs.100%29.aspx所述)替换为ICLRRuntimeHost.

如何_AppDomain使用 执行枚举ICLRRuntimeHost?可能吗?

0 投票
1 回答
1527 浏览

debugging - 托管时 CLRProfiler 未连接到 CLR

我有一个承载 CLR 的本机 Win32 应用程序,以使用 C# 作为一种复杂的“脚本”语言。

我遇到了内存泄漏,我决定尝试使用 Microsoft 的 CLR Profiler 进行调查。(我不确定泄漏是否得到管理,并且希望这个工具可以帮助揭示这一点,一方面。)

但是,当我告诉 CLRProfiler 启动我的(本机)应用程序时,尽管我的应用程序总是在运行的第一秒左右启动 CLR,但 CLRProfiler 继续显示提示Waiting for application to start common language runtime,即使我的应用程序显然正在运行其托管代码。

如果 CLRProfiler 是由仅托管程序用于启动 CLR 的存根启动的,而不是在应用程序显式加载和启动时,CLRProfiler 是否只能连接到 CLR MSCOREE.DLL?还是我只是做错了什么?

或者在启动 CLR 以使 CLRProfiler 与它相处时,我的本机应用程序需要做些什么(希望很简单)?

0 投票
2 回答
1195 浏览

.net - 我如何知道哪个运行时主机当前正在运行我的代码?

由于 Microsoft 文档声明运行时主机,.NET 有多个运行时主机来支持和执行我们的应用程序的代码,我的问题是我如何知道 Microsoft 运行时主机的哪些运行时主机正在托管我的代码。

我正在使用 C# 语言开发可能由各种运行时主机使用和/或托管的 dll 类库,因此我需要知道哪个运行时主机现在托管我的代码以满足指定条件。

0 投票
1 回答
544 浏览

c# - 从托管代码托管 CLR?

是否可以从托管应用程序进行一些CLR 托管

由于托管 API 通过COM公开,因此管道应该是可能的。

此外,从 4.0 版本的运行时开始,可以在同一个进程中托管多个 CLR

但是我不确定从另一个 CLR 引导一个 CLR。如果可能的话,可以像从本机 C++ 引导一样简单,而不使用任何非托管代码。

欢迎任何指针,谢谢。

0 投票
1 回答
552 浏览

.net - 跨本机帧捕获托管异常

是否有可能由托管代码抛出捕获托管异常,但调用堆栈上有干预本机帧?

我很难做到这一点。该应用程序是 32 位本机代码并托管 MSCLR 2.0(但大部分代码是 .NET 3.5。)

除非这个 throw 完成,否则应用程序运行良好,并且当它 throw 时究竟会发生什么取决于它运行的系统。

实际的应用程序非常复杂,所以至少在最初我会发布一些简单的概念代码来说明。本机程序(我们将调用Native.exe)运行一个我们将调用的托管程序Managed.exe。中的某处Managed.exe,用 C# 编写,如下:

MyKernel是在混合 C++/CLI 程序集中定义的托管类,我们将其称为Glue.dll. MyObject是另一个类的实例Glue.dll。那里的相关方法看起来像这样:

DoSomething是一个 C++ 函数,在Native.exe其中被虚拟调用。长话短说,它最终会回调到一个托管方法中,在该方法中Glue.dllraises MyEvent

如果MyEvent引发并且程序在 32 位 Windows XP 系统上运行,它会按预期运行,控制台将显示:

在 Windows 7 64 位系统上运行,我得到了这个:

基本上,例外只是消失得无影无踪。整个事情继续运行,就好像它从未发生过一样。(该异常对应于点击窗口上的关闭按钮,所以它的行为就像按钮没有被点击一样。)

通过远程桌面在 Windows Server 2012 系统上运行,我得到以下信息:

然后整个应用程序崩溃并显示“Native.exe 已停止工作”的对话框,并且:

如果我没有try/ ,这就是我所期望的catch

如果我在 VS2008SP 调试器下的那个环境中运行它,调试器会捕获第一次机会异常,如果我继续它,它会捕获它作为未处理的异常。

我应该注意到,本机DoSomething最终会调用 Win32GetMessage和 then DispatchMessage,并且本机到托管的回调发生在从窗口过程调用的代码中。该窗口是用 Direct3D 绘制的。托管程序将Native.exe“内核”用于所有窗口和绘图操作,并且从不单独访问 Windows。

没有任何干预函数可以Native.exe捕获任何异常。我不能说 Win32 API 函数中是否有任何异常处理程序;我不这么认为,但如果有的话可以想象地解释系统之间的行为是如何不一致的。

这大致是 Server 2012 上的实际调用堆栈,去掉了重复项:

整个系统已经运行良好很长时间了,但我以前从不需要在托管/本机转换中抛出异常。我确实希望托管应用程序代码能够自由地抛出和捕获异常,而不必担心本机主机是否正在执行本机到托管的回调。

我在网上找到的关于在这种转换中抛出异常的所有信息总是关于管理捕获本机异常,反之亦然。这是托管的捕获托管的,但是介入的本机框架使事情复杂化。

所以我关于投掷的问题一般是:

  • 这应该工作吗?它确实适用于 Windows XP,但我不知道这是定义明确的行为还是我只是幸运。

  • 如果它应该工作,它不能在所有系统上工作的可能原因是什么?

如果它应该工作,那么我想我必须增加所有托管回调以捕获托管异常,用本机异常包装它们,并在本机函数的托管包装器中捕获它并抛出原始托管异常. 这听起来像很多头发拉!