2012-07-03 13 views
6

El intento de construir un C# NPAPI plugin que han encontrado una tutorial que describe que el archivo DLL debe implementar una serie de métodos tales como NP_GetEntryPoints, NP_Initialize y NPP_New junto con un número de otros.Edificio NPAPI plug-in en C#

Sin embargo, lo que quiero entender es si simplemente puedo reflejar estos nombres de métodos y construir estructuras de datos equivalentes como se describe en el artículo (como _NPPluginFuncs) en C# y todo funcionará?

¿Podría alguien tener la amabilidad de brindar alguna orientación? ¿Es posible construir un complemento NPAPI en C# y, de ser así, cuáles son los pasos básicos involucrados?

+0

¿Hay alguien vivo por ahí? :-p –

+3

No puedo darle una respuesta detallada sobre NPAPI específicamente, pero en general, no es posible usar C# para crear una DLL con funciones exportadas compatibles con C. Podría 1) crear una DLL de C++ en modo mixto o (más probable si está más cómodo en C# que C++ administrado) 2) crear una pequeña DLL nativa que contenga sus exportaciones, que utiliza interoperabilidad COM para delegar en un ensamblado administrado escrito en C# y que contiene la mayor parte de tu funcionalidad. – shambulator

+0

Ahora, eso es básicamente una respuesta. Supuse que en un caso peor sería posible algún tipo de interoperabilidad (aunque no sabía lo suficiente sobre C++ para suponer COM) pero también pensé que habría una ruta más fácil para la interoperación entre C++ y C# –

Respuesta

4

Como se indica en la documentación:

Un plugin para el navegador NPAPI es, en su núcleo, simplemente una DLL con unos puntos de entrada específicos

Eso significa que hay que exportar alguna función de un dll regular, que se hace generalmente en C/C++. Desafortunadamente no es posible exponer ningún punto de entrada desde un dll C# simple, but look at this answer, con algún esfuerzo parece posible engañar a alguna exportación mediante algún tipo de herramienta de compilación posterior.

En cualquier caso, no espere pasar demasiadas estructuras de datos complicadas desde/hacia las interfaces del complemento, será un problema. Si está interesado en investigar más, la clave que debe usar es "Invertir P/Invocar", en analogía con P/Invoke directo que está llamando al dll normal del mundo administrado.

La razón de una DLL de C# no puede exponer directamente "puntos de entrada" es que punto de entrada en realidad son sólo algunas de direcciones dentro de la DLL poiting a algún código de montaje de ejecución inmediata. C# dll son diferentes tipos de bestias: son solo archivos que contienen IL que se compila "Just In Time" y, de hecho, dicha compilación es forzada AFAIK with some OS tricks. Esta es la razón por la cual P/Invoke inverso no es en absoluto starightforward.

+0

Esa es en realidad la declaración exacta que me confundió "Un complemento de navegador NPAPI es, en esencia, simplemente un archivo DLL con algunos puntos de entrada específicos" - Mi primer pensamiento fue 'Genial, así que puedo escribir esto en C#' Supongo que nunca realmente pensé en cómo las DLL implementan 'puntos de entrada' y siempre han supuesto que los 'puntos de entrada' en C++ y C# funcionarían de la misma manera. En retrospectiva, un pensamiento tonto, pero nunca he escrito una línea de C++ –

+0

@MaximGershkovich He actualizado la respuesta –

+0

Gracias, agradezco la aclaración. –

4

Como dice Georg Fritzsche en su comentario:

complementos NPAPI son básicamente DLL con unos cuantos requiere C-exportaciones

y no hay forma integrada de exportar funciones (en el Sentido de exportación C) de un conjunto escrito en C#.

Algunas de las opciones son:

  1. A C++ ensamblaje de modo mixto que puede exportar directamente a las funciones. Esto podría tener implicaciones para alojar el CLR en el proceso de host de su complemento.
  2. Un pequeño archivo DLL nativo que aloja las exportaciones, luego usa interoperabilidad COM para delegar en un ensamblado C# que contiene la funcionalidad del complemento. La forma "oficial" de hacer lo que se conoce como "reverse p/invoke".
  3. Un intriguing project que procesa posteriormente su ensamblaje totalmente administrado, convirtiendo los métodos estáticos marcados con un atributo personalizado en funciones de exportación expresadas. (No tengo ninguna afiliación con este proyecto, lo encontré después de que me pregunté si alguien había mejorado la manera de hacer las cosas con interoperabilidad COM.)
+0

Gracias, esto en busca de la pregunta que realmente estaba haciendo pero que no sabía cómo expresar. –