6

尝试构建 C# NPAPI 插件我发现了一个教程,它描述了您的 dll 需要实现许多方法,例如NP_GetEntryPointsNP_Initialize以及NPP_New其他一些方法。

但是我想了解的是,如果我可以简单地镜像这些方法名称并按照 C# 中的文章(如 )中的描述构造等效的数据结构,那么_NPPluginFuncs一切都会正常吗?

有人可以提供一些指导吗?是否可以在 C# 中构建 NPAPI 插件,如果可以,涉及的基本步骤是什么?

4

2 回答 2

4

如文档中所述:

NPAPI 浏览器插件的核心只是一个带有几个特定入口点的 DLL

这意味着您需要从常规 dll 中导出一些函数,这通常在 C/C++ 中完成。不幸的是,不可能从普通的 C# dll 公开任何入口点,但看看这个答案,通过一些努力似乎可以通过某种后期构建工具来欺骗一些导出。

无论如何不要期望从/向插件接口传递太多复杂的数据结构,这将是一件痛苦的事情。如果您有兴趣进行更多研究,则使用的关键是“反向 P/Invoke”,类似于从托管世界调用常规 dll 的直接 P/Invoke。

C# dll 不能直接公开“入口点”的原因是 入口点实际上只是 dll 内的某个地址,指向一些立即可执行的汇编代码。C# dll 是不同种类的野兽:它们只是包含“及时”编译的 IL 的文件,实际上这种编译是通过一些操作系统技巧强制 AFAIK 进行的。这就是反向 P/Invoke 根本不直接的原因。

于 2012-07-05T13:19:30.313 回答
4

正如 Georg Fritzsche 在他的评论中所说:

NPAPI 插件基本上是带有一些必需的 C 导出的 DLL

并且没有内置方法可以从用 C# 编写的程序集中导出函数(在 C 导出意义上)。

您的一些选择是:

  1. 可以直接导出函数的混合模式 C++ 程序集。这可能会对在插件的宿主进程中托管 CLR 产生影响。
  2. 托管导出的小型本地 DLL,然后使用 COM 互操作委托给包含插件功能的 C# 程序集。执行所谓“反向 p/invoke”的“官方”方式。
  3. 一个有趣的项目,它对您的完全托管程序集进行后处理,将标记有自定义属性的静态方法转换为命名函数导出。(我与这个项目没有任何关系;在我想知道是否有人改进了 COM 互操作的做事方式后,我偶然发现了它。)
于 2012-07-06T14:53:41.940 回答