Com CoCreateInstance需要很多时间

Com CoCreateInstance需要很多时间,com,regasm,Com,Regasm,在注册(RegAsm)我的C#COM visible类后,我发现CoCreateInstance(uuuIdof(myclass))只在第一次使用时花费了很多时间,同一客户端进程中的后续尝试会立即得到解决。知道为什么要花时间吗? NGen不是我的选择 我的COM服务器在C#中,客户端在MFC/ATL中 CComPtr<namespace::Imyclass> obj; hrx = obj.CoCreateInstance(__uuidof(namespace::myclass));

在注册(RegAsm)我的C#COM visible类后,我发现
CoCreateInstance(uuuIdof(myclass))
只在第一次使用时花费了很多时间,同一客户端进程中的后续尝试会立即得到解决。知道为什么要花时间吗? NGen不是我的选择

我的COM服务器在C#中,客户端在MFC/ATL中

CComPtr<namespace::Imyclass> obj;
hrx = obj.CoCreateInstance(__uuidof(namespace::myclass));
CComPtr obj;
hrx=obj.CoCreateInstance(uuuidof(namespace::myclass));

CoCreateInstance
的第一次调用可能需要查阅注册表和文件系统,加载适当的代码,允许其初始化,最后调用工厂来创建您请求的实例(如果可以找到的话)


第二个呼叫从前面的步骤中受益匪浅。如果第一次调用成功,那么代码已经加载并初始化,它所要做的就是再次调用工厂。

CoCreateInstance
的第一次调用可能需要查阅注册表和文件系统,加载适当的代码,允许其初始化,最后调用一个工厂来创建您请求的实例(如果可以找到的话)


第二个呼叫从前面的步骤中受益匪浅。如果第一次调用成功,那么代码已经加载并初始化,它所要做的就是再次调用工厂。

CoCreateInstance
的第一次调用必须加载到进程中并初始化.NET运行时。然后,您的DLL必须被加载,“验证”,并编译成机器代码(尽管及时启动有助于加快启动速度)。NET运行时还必须解析程序集的元数据,然后动态生成并编译“COM可调用包装器”(),它们是非托管COM世界和托管.NET运行时之间的桥梁代理。您的代码可能使用的任何其他库也需要加载、验证并可能编译为机器代码(如果不是NGEN'd)

这本来就是一个昂贵的过程。你提到的延误并非闻所未闻

我不相信你能做很多事情来加快速度。我建议您考虑是否可以在程序生命周期的早期通过在启动后不久创建一个对象来承受冲击。这不会加快速度,但可能会显著改善用户体验。如果您的程序无法容忍延迟,那么您不应该使用.NET来编写COM对象(更具体地说,您根本不应该在进程中使用.NET。这不是使用COM的问题,而是加载.NET的问题)

顺便说一句,这就是为什么在.NET中编写外壳扩展。。。“非常气馁”。请参阅这篇关于此主题的最新文章,其中也涉及到.NET的启动性能:


(这就是为什么我早些时候问您运行的是哪种类型的客户端。已经运行.NET托管代码的客户端取决于.NET运行时,并且不会受到这些延迟的影响)

CoCreateInstance
的第一次调用必须加载到进程中并初始化.NET运行时。然后,您的DLL必须被加载,“验证”,并编译成机器代码(尽管及时启动有助于加快启动速度)。NET运行时还必须解析程序集的元数据,然后动态生成并编译“COM可调用包装器”(),它们是非托管COM世界和托管.NET运行时之间的桥梁代理。您的代码可能使用的任何其他库也需要加载、验证并可能编译为机器代码(如果不是NGEN'd)

这本来就是一个昂贵的过程。你提到的延误并非闻所未闻

我不相信你能做很多事情来加快速度。我建议您考虑是否可以在程序生命周期的早期通过在启动后不久创建一个对象来承受冲击。这不会加快速度,但可能会显著改善用户体验。如果您的程序无法容忍延迟,那么您不应该使用.NET来编写COM对象(更具体地说,您根本不应该在进程中使用.NET。这不是使用COM的问题,而是加载.NET的问题)

顺便说一句,这就是为什么在.NET中编写外壳扩展。。。“非常气馁”。请参阅这篇关于此主题的最新文章,其中也涉及到.NET的启动性能:


(这就是为什么我早些时候问您运行的是哪种类型的客户端。已经运行.NET托管代码的客户端取决于.NET运行时,并且不会受到这些延迟的影响)

如果此延迟仅适用于第一次加载(在计算机启动后),则这是由加载所有库引起的。启动后的第一次延迟(或长时间不使用.NET后)总是很慢。(见我的答复)

每次装载也可能导致延迟。今天我发现互联网连接也会导致延迟

测量值:

  • 无以太网和WiFi连接延迟:94毫秒(Win7)/1.5(WinXP)
  • Windows XP:Internet连接(使用代理和非标准网关;不允许所有端口):4-5秒(WinXP)
  • 已连接到以太网而未连接到Internet:10秒(Win7)
  • 连接到以太网后短路(Windows测试Internet连接;网络图标上的蓝色圆圈):30秒(Win7)
  • Internet连接(使用代理和非标准网关;只允许少数端口):30秒(Win7)
  • *非标准网关:每台计算机允许的TCP端口和连接不同(WinXP和Win7不同)

    在Windows7(x64)和WinXP上测试。我对它进行了测试,因为它来自一位客户的投诉,并找到了延迟到CoCreateInstance加载的库是c#格式的,并且已签名(使用snk和用于签名可执行文件的标准证书对程序集进行了签名)

    另请参见:

    如果此删除