Com CoCreateInstance需要很多时间
在注册(RegAsm)我的C#COM visible类后,我发现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));
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后)总是很慢。(见我的答复) 每次装载也可能导致延迟。今天我发现互联网连接也会导致延迟 测量值: