问题标签 [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.
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
c# - 有没有办法从 c++ 库中获取 ICLRMetaHost
问题说明的差不多。我有一个运行的 .net exe,然后加载我的库(在 c++ 中)。有什么方法可以让 mscoree 在启动 .net exe 时加载 ICLRMetaHost 或类似接口?我想这样做主要是为了可以从我的本机库中访问 gc 和内存相关设置以进行调试。
使用单主机 api 指出类似的实现的奖励点。
c# - 为什么即使 GetLastError 为 0,CLRHosting API 也不起作用?
我正在尝试按照本教程将托管 C# dll 加载到托管 C# 进程中。我已经用 C/C++ 编写了相当多的代码,并且具有 MS COM 的工作知识,但是 C# 和托管代码对我来说是一个全新的野兽,所以如果我做错了什么,请原谅我。我的系统上有 .NET 4.5,这是默认使用的相同运行时(我认为)。到目前为止的代码(主要从上面的链接复制):
代码 - C#
本机代码
问题
现在的问题是,当我执行本机代码时,GetLastError()
返回0
. 那是在调用之后ExecuteInDefaultAppDomain()
。根据 Codeproject 链接,它应该显示对话框,但在我的情况下它没有显示任何内容。
我不确定这个问题,任何建议/指针都会有所帮助。谢谢。
.net - SynchronizationContext.Current 在来自非托管主机的每次调用时重置为 null
我有托管 CLR 运行时的 Win32 应用程序。不涉及线程。只是主线程。我发现每次调用托管端SynchronizationContext.Current
都会重置为空。我确实调用SynchronizationContext.SetSynchronizationContext
了实现IDotNetEngine
. 我打电话但仍然在SynchronizationContext.SetSynchronizationContext
它会恢复为空。我可以每次都设置它,但我使用 .Net 端的 WinForms 控件,并且该控件在用户按键时使用。并且因为它是 null 它会在代码中崩溃,因为该部分在不同的线程中执行。Method1
Method2
await
SynchronizationContext.Current
await
我在 .Net 的源代码中的 SynchronizationContext.cs 中找到了此文本
“问题是在反向 p/invoke 中设置为 AppDomain 的 SynchronizationContexts 不会保留在该 AppDomain 中;下一次同一个线程调用同一个 AppDomain, [....] 上下文将为空”。他们有解决方案,但不适用于桌面 .Net Framework。
所以我的问题是可以做些什么吗?.Net Framewrok 的那部分没有源代码,但看起来 .Netm_ExecutionContext
在离开运行时重置执行上下文 () 并将控制权返回给非托管代码。
详细信息:
我使用CorBindToRuntimeEx
thenAppDomain.CreateInstanceFrom
然后强制ObjectHandle.Unwrap
转换为IDotNetEngine
接口。
IDotNetEngine 声明如下:
在非托管方面有类似的界面。
c# - .NET >= 4.0 中的 StackOverflowException - 让其他线程有机会优雅地退出
有没有办法至少推迟托管应用程序的终止(几十毫秒)并设置一些共享标志以让其他线程有机会优雅地终止(SO线程本身显然不会进一步执行任何事情)?我正在考虑为此使用 JIT 调试器或 CLR 托管 - 如果有人之前尝试过,我很好奇。
为什么我想做这么错的事?:
没有太多细节——想象一下这个类比——你在赌场赌轮盘赌,突然发现轮盘赌是不可靠的假货。因此,您想立即离开赌场,但可能想先从赌桌上取回您的赌注。不幸的是,我不能为此利用单独的流程,因为有非常严格的性能要求。
试过但没有用:
StackOverflowException 的 .NET 行为(以及 MSDN 上的矛盾信息)已经在 SO 上讨论过多次 - 快速总结一下:
HandleProcessCorruptedStateExceptionsAttribute(例如在 appdomain 未处理的异常处理程序上)不起作用
ExecuteCodeWithGuaranteedCleanup不起作用
legacyUnhandledExceptionPolicy不起作用
可能很少有其他尝试如何处理 StackOverflowExceptions - 但似乎很明显,CLR 终止了整个过程,正如Hans Passant在这个很好的答案中提到的那样。
考虑尝试:
- JIT 调试器 - 冻结异常线程,设置一些共享标志(可能在固定位置)并在短时间内解冻其他线程。
- CLR 托管和设置未处理的异常策略
你还有别的想法吗?或者这两种方式的任何经验(成功/不成功)?
c# - “mono_add_internal_call”是否可以仅使用 CLR-Hosting?
是否有任何功能可以在使用单声道的 CLR-Hosting 中具有与“mono_add_internal_call”相同的可能性?
单核细胞增多症
C++ 代码:
C#代码:
谢谢
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..
抱歉,由于我在这种类型的编码方面没有太多经验,所以我不知道如何正确地提出问题。
c++ - 在 C++ 应用程序中托管 .NET CLR:沙盒应用程序域 (CAS)
TL;博士; 如何从 C++ 应用程序创建沙盒化 AppDomain(配置 CAS)?
长版:
我在 C++ 应用程序中托管 .NET CLR,一切正常……但是,我的 AppDomain 完全信任,我希望对它可以做的事情有更精细的控制(即配置 PermissionSets 等.) 因为我将加载可能导致损坏的未知程序集。
这是它的要点:
最终,我拥有了创建 AppDomain 所需的一切(请假装我实际上正在处理异常,测试来自每个调用的 HRESULT,等等......):
任何想法或代码示例表示赞赏。
c# - .NET 应用程序在使用 CLR Hosting API 时无法完全工作
我正在使用ICLRRuntimeHost::ExecuteInDefaultAppDomain
启动应用程序的方法加载一个 .NET 应用程序。但是,应用程序正在使用Log4Net
它应该在启动后输出一条信息消息,但它永远不会。虽然正常打开时它工作正常,所以它一定是CLR托管环境导致它无法正常运行,我只是不知道究竟是什么。
这是执行日志记录的代码:
c# - 从非托管代码提供 Action 或 EventHandler
我正在使用 JEDI 代码库来托管 CLR,以便在 Delphi 中使用 C# 代码。对于常见情况,使用TJclClrHost
this 效果很好。但是,现在我想在 C# 代码中注册一个事件。有多种选择,C#-Code 的一些示例:
在 Delphi 中,我检索add_MyEvent...
. 根据使用的事件,我必须通过 a[mscorlib]System.Action
或[mscorlib]System.EventHandler
. 问题是,如何在 Delphi 中创建匹配实例?两个预期的参数都是委托,所以没有可以调用的构造函数来获取实例。
虽然我发现了很多关于将回调从托管代码传递到非托管代码的资源(例如,这个答案描述了UnmanagedFunctionPointer
-attribute,还有这篇 MSDN 文章描述GetDelegateForFunctionPointer
),但我真的找不到对我的情况有帮助的东西。