问题标签 [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 投票
0 回答
246 浏览

c# - .Net Hosting API 内存使用情况

我正在尝试使用 .Net Hosting API 收集 AppDomain 使用的内存信息。我在 C++ 上实现了自定义 IHostMemoryManager 和 IHostMalloc 类,并在创建 CRL 运行时期间指定了它们。它类似于那篇文章 - http://www.codeproject.com/Articles/418259/CLR-Hosting-Customizing-the-CLR-Part-2

我的主要想法是每次分配都会调用IHostMAlloc::Alloc 。我添加了只计算 cbSize 参数的计数器,并在运行时停止后显示它。

但问题是这个计数是不同的。对于带有 Hello World 的空控制台应用程序的典型运行,它显示 ~ 400kb,这似乎没问题。但是当我使用这样的代码时:

但在这种情况下,它仍然显示 ~400kb。执行期间的进程在任务管理器中显示 ~100mb 的 WorkingSet 内存。

是否可以计算托管 API 中使用的内存?

PS我知道AppDomain.MonitoringTotalAllocatedMemorySize,但它显示整个 AppDomain 的总使用内存,我想获取特定使用内存线程的数据。

UPDATE1:添加了我使用的 Alloc 代码:

g_allocatedMemMap - 计算每个线程的内存分配

g_totalAllocs - 计算总内存分配

g_noAllocs - 分配数

MyHostAlloc 继承 IHostMalloc 接口

在我的情况下,对于空的 consol 应用程序和 MemoryPressure 调用分配数是 ~15000

0 投票
1 回答
650 浏览

c# - 有没有办法从 c++ 库中获取 ICLRMetaHost

问题说明的差不多。我有一个运行的 .net exe,然后加载我的库(在 c++ 中)。有什么方法可以让 mscoree 在启动 .net exe 时加载 ICLRMetaHost 或类似接口?我想这样做主要是为了可以从我的本机库中访问 gc 和内存相关设置以进行调试。

使用单主机 api 指出类似的实现的奖励点。

0 投票
1 回答
400 浏览

c# - 为什么即使 GetLastError 为 0,CLRHosting API 也不起作用?

我正在尝试按照本教程将托管 C# dll 加载到托管 C# 进程中。我已经用 C/C++ 编写了相当多的代码,并且具有 MS COM 的工作知识,但是 C# 和托管代码对我来说是一个全新的野兽,所以如果我做错了什么,请原谅我。我的系统上有 .NET 4.5,这是默认使用的相同运行时(我认为)。到目前为止的代码(主要从上面的链接复制):

代码 - C#

本机代码

问题

现在的问题是,当我执行本机代码时,GetLastError()返回0. 那是在调用之后ExecuteInDefaultAppDomain()。根据 Codeproject 链接,它应该显示对话框,但在我的情况下它没有显示任何内容。

我不确定这个问题,任何建议/指针都会有所帮助。谢谢。

0 投票
0 回答
174 浏览

.net - SynchronizationContext.Current 在来自非托管主机的每次调用时重置为 null

我有托管 CLR 运行时的 Win32 应用程序。不涉及线程。只是主线程。我发现每次调用托管端SynchronizationContext.Current都会重置为空。我确实调用SynchronizationContext.SetSynchronizationContext了实现IDotNetEngine. 我打电话但仍然在SynchronizationContext.SetSynchronizationContext它会恢复为空。我可以每次都设置它,但我使用 .Net 端的 WinForms 控件,并且该控件在用户按键时使用。并且因为它是 null 它会在代码中崩溃,因为该部分在不同的线程中执行。Method1Method2awaitSynchronizationContext.Currentawait

我在 .Net 的源代码中的 SynchronizationContext.cs 中找到了此文本
“问题是在反向 p/invoke 中设置为 AppDomain 的 SynchronizationContexts 不会保留在该 AppDomain 中;下一次同一个线程调用同一个 AppDomain, [....] 上下文将为空”。他们有解决方案,但不适用于桌面 .Net Framework。

所以我的问题是可以做些什么吗?.Net Framewrok 的那部分没有源代码,但看起来 .Netm_ExecutionContext在离开运行时重置执行上下文 () 并将控制权返回给非托管代码。

详细信息:
我使用CorBindToRuntimeExthenAppDomain.CreateInstanceFrom然后强制ObjectHandle.Unwrap转换为IDotNetEngine接口。

IDotNetEngine 声明如下:

在非托管方面有类似的界面。

0 投票
2 回答
204 浏览

c# - .NET >= 4.0 中的 StackOverflowException - 让其他线程有机会优雅地退出

有没有办法至少推迟托管应用程序的终止(几十毫秒)并设置一些共享标志以让其他线程有机会优雅地终止(SO线程本身显然不会进一步执行任何事情)?我正在考虑为此使用 JIT 调试器或 CLR 托管 - 如果有人之前尝试过,我很好奇。

为什么我想做这么错的事?:

没有太多细节——想象一下这个类比——你在赌场赌轮盘赌,突然发现轮盘赌是不可靠的假货。因此,您想立即离开赌场,但可能想先从赌桌上取回您的赌注。不幸的是,我不能为此利用单独的流程,因为有非常严格的性能要求。

试过但没有用:

StackOverflowException 的 .NET 行为(以及 MSDN 上的矛盾信息)已经在 SO 上讨论过多次 - 快速总结一下:

HandleProcessCorruptedStateExceptionsAttribute(例如在 appdomain 未处理的异常处理程序上)不起作用

ExecuteCodeWithGuaranteedCleanup不起作用

legacyUnhandledExceptionPolicy不起作用

可能很少有其他尝试如何处理 StackOverflowExceptions - 但似乎很明显,CLR 终止了整个过程,正如Hans Passant在这个很好的答案中提到的那样。

考虑尝试:

  • JIT 调试器 - 冻结异常线程,设置一些共享标志(可能在固定位置)并在短时间内解冻其他线程。
  • CLR 托管和设置未处理的异常策略

你还有别的想法吗?或者这两种方式的任何经验(成功/不成功)?

0 投票
1 回答
439 浏览

c# - “mono_add_internal_call”是否可以仅使用 CLR-Hosting?

是否有任何功能可以在使用单声道的 CLR-Hosting 中具有与“mono_add_internal_call”相同的可能性?

单核细胞增多症

C++ 代码:

C#代码:

谢谢

0 投票
2 回答
816 浏览

c++ - 在哪里可以找到 mscorlib::_AppDomain、mscorlib::_Type 等的声明

我将其用于我的基础https://code.msdn.microsoft.com/CppHostCLR-e6581ee0/sourcecode?fileId=21953&pathId=1366553273

但在我的 VS2010 中,我无法获得智能感知或去声明。我试过谷歌,但它把我带到了 .NET 文档。

例如,我无法获取参数(或找到其声明的位置): spDefaultAppDomain-> Load_2 (bstrAssemblyName, &spAssembly);

_AppDomainPtr spDefaultAppDomain = NULL;_AppDomainPtr 基本上是 mscorlib::_AppDomain..

抱歉,由于我在这种类型的编码方面没有太多经验,所以我不知道如何正确地提出问题。

0 投票
0 回答
653 浏览

c++ - 在 C++ 应用程序中托管 .NET CLR:沙盒应用程序域 (CAS)

TL;博士; 如何从 C++ 应用程序创建沙盒化 AppDomain(配置 CAS)?

长版:

我在 C++ 应用程序中托管 .NET CLR,一切正常……但是,我的 AppDomain 完全信任,我希望对它可以做的事情有更精细的控制(即配置 PermissionSets 等.) 因为我将加载可能导致损坏的未知程序集。

这是它的要点:

最终,我拥有了创建 AppDomain 所需的一切(请假装我实际上正在处理异常,测试来自每个调用的 HRESULT,等等......):

任何想法或代码示例表示赞赏。

0 投票
0 回答
81 浏览

c# - .NET 应用程序在使用 CLR Hosting API 时无法完全工作

我正在使用ICLRRuntimeHost::ExecuteInDefaultAppDomain启动应用程序的方法加载一个 .NET 应用程序。但是,应用程序正在使用Log4Net它应该在启动后输出一条信息消息,但它永远不会。虽然正常打开时它工作正常,所以它一定是CLR托管环境导致它无法正常运行,我只是不知道究竟是什么。

这是执行日志记录的代码:

0 投票
0 回答
126 浏览

c# - 从非托管代码提供 Action 或 EventHandler

我正在使用 JEDI 代码库来托管 CLR,以便在 Delphi 中使用 C# 代码。对于常见情况,使用TJclClrHostthis 效果很好。但是,现在我想在 C# 代码中注册一个事件。有多种选择,C#-Code 的一些示例:

在 Delphi 中,我检索add_MyEvent.... 根据使用的事件,我必须通过 a[mscorlib]System.Action[mscorlib]System.EventHandler. 问题是,如何在 Delphi 中创建匹配实例?两个预期的参数都是委托,所以没有可以调用的构造函数来获取实例。

虽然我发现了很多关于将回调从托管代码传递到非托管代码的资源(例如,这个答案描述了UnmanagedFunctionPointer-attribute,还有这篇 MSDN 文章描述GetDelegateForFunctionPointer),但我真的找不到对我的情况有帮助的东西。