【问题标题】:Can I create a regular windows DLL (for a plugin) in .NET?我可以在 .NET 中创建常规 Windows DLL(用于插件)吗?
【发布时间】:2009-01-01 04:30:38
【问题描述】:

我正在尝试为程序创建一个插件。该程序通过加载您的插件 DLL 并在该 DLL 中执行特定命名的函数来工作。很标准的东西。但是,我想在 C# 中创建我的插件(而且我有点新手)。我的问题是,我可以从 C# 中导出常规的 C 类函数吗?或者我如何轻松地创建一个存根来做到这一点?

到目前为止,谷歌还没有提供帮助。

【问题讨论】:

    标签: c# .net dll


    【解决方案1】:

    通过一系列相当复杂的步骤,我设法得到了我想要的东西:

    在 C# 方面:

    1. 我创建了一个带有接口的 C# 类
    2. 使其 COM 可见,
    3. 使用强名称密钥文件对程序集进行签名
    4. 使用 gacutil 将程序集添加到 GAC
    5. 用 REGASM 工具注册它并生成一个 tlb 类型库文件。

    然后我创建了一个 MFC DLL,公开了我需要为插件接口导出的函数。然后在我的 C++ 代码中使用 #import 指令加载前面提到的 tlb 文件。这会生成一个存根,因此我可以轻松地通过 COM 从 C++ 调用我的 C# 代码。

    结果似乎完美运行并且性能是瞬时的(这有点令人惊讶,我认为 CLR 加载开销会很明显)。

    将 CLR 加载到这个特定的应用程序中并不是真正的问题,但我担心其他插件的版本控制问题。当我通过 COM 完成这一切时,这真的是一个问题吗?

    【讨论】:

    • 如果你有一个一致的地方来保存你的 dll,并且它没有被任何其他应用程序共享,那么你不需要将它添加到 GAC。您可以改用以下命令行: regasm /tlb /codebase myDotNetAssembly.dll
    【解决方案2】:

    不,C# DLL 是托管的,这意味着您需要加载 CLR 才能让计算机理解它。您也许可以使用普通的 C++ 项目,将 C++/CLI 添加到其中(项目设置),使用 C# DLL,然后编写基本的 C 导出函数来环绕它。

    这将是我要尝试的第一件事。

    【讨论】:

      【解决方案3】:

      您无法使用 C# 或任何 .Net 框架语言创建本机 DLL。但是,.Net 框架可以通过 P/Invoke 使用本机 DLL。

      无论如何,用 C# 编写本机 DLL 是不切实际的。最好用 C 或 C++ 编写 DLL。

      如果您要使用 .Net 框架语言(托管 C++、C#、.Net)制作最终程序,则可以使用 C# 制作 DLL,否则不要。

      【讨论】:

      • 托管 C++ 现在称为 C++/CLI :)
      • Cyril 的回答在技术上并不准确,因为您可以使用与 .NET 很好地互操作的 Visual C++ 来做到这一点。
      【解决方案4】:

      给操作:

      我为使用旧 COM 互操作程序集的包进行自定义插件开发。我们想使用 c#,但由于它严重依赖后期绑定,所以我们不得不使用 vb.net,并将接口类构建为 COM 互操作类。一旦你克服了这个障碍,你通常就很成功了。 “接口”库之外的所有支持库都是在 C# 中完成的,因此当基础应用程序的新版本即将推出时,工作量就会减少。

      很想听听您编写插件的目的是什么,所以如果有任何我们可以帮助您的提示和/或技巧,我们可以在您继续前进时这样做。

      【讨论】:

        【解决方案5】:

        如果您使用 Visual C++,您可以创建一个本机 dll,该 dll 包含用 .NET dll 编写的功能。如果您完全了解 C++(或者如果您是一个快速学习者),那么编写一个调用您在 C# 程序集中实现的函数的 C++ shim dll 将相当简单。

        但是,你不能只使用 C#。

        【讨论】:

          【解决方案6】:

          您可以在 C++/CLI 中编写程序集/dll,将函数公开为标准 DLL 导出。然后,您可以根据需要将它们用作 C# 程序集中的方法的代理。

          但是,这并不意味着这是一个好主意。强制 CLR 加载到进程中是一个非常激烈的步骤,插件作者不应强制其主机。

          例如,Microsoft 强烈建议 shell 扩展作者(即 Windows 资源管理器的插件代码)不要在 .NET 中(通过 COM)编写这些插件,因为它们不会'不希望将 CLR 加载到如此关键的应用程序中。

          应用程序有可能(尽管不太可能)需要加载 CLR 本身和某个时间点,如果插件已经加载了给定版本,那么这可能会产生版本控制问题。此外,CLR 不能从进程中卸载,而宿主应用程序可能希望能够卸载插件。

          【讨论】:

          • 所有问题都没有考虑。我正在考虑使用 MFC C++ DLL 和 COM 互操作加载我的 C# 代码。
          猜你喜欢
          • 1970-01-01
          • 2011-01-19
          • 1970-01-01
          • 2011-03-06
          • 2011-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多