小编ekw*_*ekw的帖子

强制GC.Collect()减少时间敏感代码中运行的机会?

在一次采访中,我被要求提出一种方法来确保c#中的代码块能够在一致的时间内运行以满足假设的时间要求.访问者提到,一种方法是在执行代码块之前调用垃圾收集器进行收集,这样可以显着降低GC在该代码块中再次运行的可能性.它被应用于医疗设备的准确的基于时间的测量,其中垃圾收集可以影响那些测量.

这对我来说很有意义,但我找不到支持它的任何信息.我审查的一般共识是永远不要调用GC.Collect(),并且例外不包括这种情况.

可以运行GC.Collect()真正降低它很快就会运行的概率吗?这是使用.net框架执行此操作的正确方法吗?GC.Collect()是否也为其他CLR程序收集或仅适用于当前进程?

c# performance garbage-collection

5
推荐指数
2
解决办法
477
查看次数

C++/CLI 包装器 DLL TypeLoadException 字段过多

我有本机(非托管)C++ DLL,它们由单个 C++/CLI dll 包装(通过 .lib 文件链接)。这些非托管 C++ DLL 有相当多的类,其中包含大量方法和大量常量数据(例如字符串、十六进制值等),这些数据在包含的标头中定义。

但对于 C++/CLI 包装器 DLL,它只是本机 dll 的包装和编组层。然而,它的二进制大小与本机 dll 一样大。我相信这导致我达到了硬编码限制,当 C# 应用程序加载它时会引发异常: System.TypeLoadException: Internal limit: Too much fields

C# 应用程序永远不会使用本机 DLL 标头中定义的字段。

它能够通过启用字符串池(减少几MB)来缓解这个问题,但这看起来像是一种黑客行为。

为什么 DLL 的简单包装器与该 DLL 的大小相同?有没有办法可以标记 const 数据,以便 C# 应用程序不会加载它们?

c++-cli visual-c++

2
推荐指数
1
解决办法
906
查看次数

如何使用C++/CLI Wrapper将变量参数从托管传递到非托管?

要在托管域中实现params(可变参数)功能,我们在c ++/cli中执行以下操作,例如:

funcManaged(int n, ...array<int>^ variableParams)
Run Code Online (Sandbox Code Playgroud)

我对如何将其传递给接受可变参数的非托管域感到茫然.

funcUnmanaged(int n, ...)
Run Code Online (Sandbox Code Playgroud)

我试图传入数组,但结果很糟糕(访问冲突,垃圾数据等).

//where unmanagedVariableParamsArray is an int array
funcUnmanaged(int n, unmanagedVariableParamsArray);
Run Code Online (Sandbox Code Playgroud)

资源建议创建一个va_list并传递它,

vFuncUnmanaged(int n, va_list vl)
Run Code Online (Sandbox Code Playgroud)

但是如何在c ++/cli域中创建va_list以接受variableParams?重构遗留的非托管代码库不是理想的解决方案.

.net c# c++ c++-cli visual-c++

1
推荐指数
1
解决办法
1649
查看次数

标签 统计

c# ×2

c++-cli ×2

visual-c++ ×2

.net ×1

c++ ×1

garbage-collection ×1

performance ×1