【问题标题】:How do you delay load a managed DLL from within an unmanaged app?如何延迟从非托管应用程序中加载托管 DLL?
【发布时间】:2010-11-28 11:45:55
【问题描述】:

我有一个本机 c++ 应用程序,我想使用一些托管类型,它们位于单独的托管 dll 中。我相信做到这一点并仍然保持 C++ 应用程序完全原生的一种方法是使用 COM 与 .NET 互操作。但是我的问题是我的应用程序最初必须在没有安装 CLR 的机器上运行,所以我不希望加载 CLR,除非我实际使用调用托管 DLL 的代码路径。

如何延迟加载托管 DLL?

【问题讨论】:

    标签: c# .net visual-studio visual-studio-2008 com


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为实现这一点的最佳方法是通过 COM 互操作,在这种情况下是托管的。如果您的应用程序是本机的,则默认情况下它不会加载 CLR。您可以通过创建一个 COM 对象来“延迟加载”CLR,该对象仅在实际需要时才在托管程序集中定义。 CLR 的 COM 层将负责在该点加载 CLR 并将 CCW 返回到托管对象。

      【讨论】:

      • 我试过这个,但是为了使用 COM 互操作,你需要用 /clr:oldSyntax 编译,而仅仅这样做单独会导致 CLR 被加载,没有甚至实际调用任何 COM 互操作 > 托管 DLL 代码。这听起来像正确的行为吗?
      • @Leaks,不应该。如果您从托管程序集中导出 TLB 并注册它,您应该能够像创建任何其他 COM 对象一样创建该对象。它在本机代码中应该与任何其他 COM 对象没有区别。
      • 你是对的,但是我读到的关于如何导入程序集 TLB 的 TechNet 文章说我必须在编译器中设置 /clr:oldSyntax 标志。事实证明这是完全错误的。
      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 2019-08-15
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多