在一次采访中,我被要求提出一种方法来确保c#中的代码块能够在一致的时间内运行以满足假设的时间要求.访问者提到,一种方法是在执行代码块之前调用垃圾收集器进行收集,这样可以显着降低GC在该代码块中再次运行的可能性.它被应用于医疗设备的准确的基于时间的测量,其中垃圾收集可以影响那些测量.
这对我来说很有意义,但我找不到支持它的任何信息.我审查的一般共识是永远不要调用GC.Collect(),并且例外不包括这种情况.
可以运行GC.Collect()真正降低它很快就会运行的概率吗?这是使用.net框架执行此操作的正确方法吗?GC.Collect()是否也为其他CLR程序收集或仅适用于当前进程?
我有本机(非托管)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# 应用程序不会加载它们?
要在托管域中实现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?重构遗留的非托管代码库不是理想的解决方案.