我在C++ dll上构建,通过在C#中编写代码.
我得到一个错误,说
检测到LoaderLock消息:尝试在OS Loader锁定内执行托管执行.不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起.
我试着搜索这个错误究竟意味着什么,但是我正在绘制毫无意义的文章,大多说这只是一个警告,我应该在Visual Studio中关闭它.其他解决方案似乎是由于ITunes,或者在使用DirectX进行编程时出现此问题.我的问题与两者无关.
任何人都能解释一下,这究竟意味着什么?
我正在做一些速度测试,我注意到Enum.HasFlag比使用按位操作慢大约16倍.
有谁知道Enum.HasFlag的内部以及为什么它如此之慢?我的意思是两倍慢不会太糟糕但是当它慢了16倍时它会使该功能无法使用.
如果有人想知道,这是我用来测试其速度的代码.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace app
{
public class Program
{
[Flags]
public enum Test
{
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8
}
static int num = 0;
static Random rand;
static void Main(string[] args)
{
int seed = (int)DateTime.UtcNow.Ticks;
var st1 = new SpeedTest(delegate
{
Test t = Test.Flag1;
t |= (Test)rand.Next(1, 9);
if (t.HasFlag(Test.Flag4))
num++;
});
var st2 = new SpeedTest(delegate
{
Test t = …Run Code Online (Sandbox Code Playgroud) 有一个DLL,由主(桌面)应用程序动态加载Windows.LoadLibrary.那是因为有很多类似的DLL,并且只需要在运行时加载很少的单个DLL.因此静态链接不是一种选择.
问题是,在加载其中一个DLL时,主应用程序每隔一段时间就会挂起.请注意,问题很可能发生在每一个问题上.可能是因为他们有很多共同的代码库.
问题似乎是装载机锁定(请参阅此SO答案).我发现了一张共同的代码,即在所使用的由所有的DLL在启动时begin...end所述的-section library-单元(即project.dpr),其中GetModuleHandle和GetProcAddress使用.
我发现,这是一个完全没有DLL的东西,因为begin...endDLL的项目文件的部分实际上是库的DllMain函数,并且调用这样的函数会导致死锁(命名加载器锁).我在本微软最佳实践指南中读到了这一点.
所以我重建了我的代码,这些调用稍后在调用Windows.LoadLibrary完成后调用.
不幸的是,悬挂问题仍然存在.:-(
然后我运行调试器,逐步完成在执行一行代码之前调用的每个初始化.我确定,许多第三方代码违反了DLL初始化代码中要做什么和不做什么的指南:
所有上述动态加载其他DLL在initialization代码或请求过程指针通过GetProcAddress.我认为这些调用导致我的DLL加载时挂起.
是的,只有少数Delphi开发人员知道危险initialization吗?我该怎么办?