如何从非托管应用程序中延迟加载托管的DLL?

问题描述:

我有一个本地的c + +应用程序,我想使用一些单独的托管DLL中的托管类型。我相信有一种方法可以做到这一点,并且仍然保持C++应用程序的完全本地化,即使用COM与.NET进行互操作。然而,我的问题是,我的应用程序必须最初在没有安装CLR的机器上运行,所以我不希望CLR被加载,除非我实际上使用调用到受管DLL的代码路径。如何从非托管应用程序中延迟加载托管的DLL?

我该如何延迟加载托管DLL?

我认为实现这一目标的最佳方式是通过COM互操作,本地托管在这种情况下。如果你的应用程序是本地的,那么默认情况下不会加载CLR。您可以通过创建只在实际需要时才在托管程序集中定义的COM对象来“延迟加载”CLR。 CLR的COM层将负责在该点加载CLR并将CCW返回给被管理对象。

+0

我试过这个,但是为了使用COM interop,你需要使用/ clr:oldSyntax进行编译,并且只做*独立*导致CLR被加载,*没有*甚至实际调用任何COM互操作>受管理DLL代码。这听起来像是正确的行为吗? – 2009-09-15 14:45:01

+0

@泄露,它不应该。如果从托管程序集中导出TLB并注册它,则应该可以像创建其他COM对象一样创建对象。它应该与其他COM对象的本地代码无法区分。 – JaredPar 2009-09-15 14:49:37

+0

你说得对,但是我读到的关于如何导入程序集TLB的TechNet文章说我必须在编译器中设置/ clr:oldSyntax标志。这竟然是完全错误的。 – 2009-09-22 15:26:08

我建议为托管组件制作一个COM callable wrapper

你可以拥有自己的.NET类,并带有可以被非托管代码引用的接口(在我的例子中,我有传统的ASP实例化一个.NET构建的对象)。