usar - ¿Cómo empiezo a diseñar e implementar una interfaz de script para mi aplicación.NET?
usar interface c# (8)
¿Cómo empiezo a diseñar e implementar una interfaz de script para mi aplicación .NET?
Existe VSTA
(el equivalente .NET de VBA
para COM
), pero por lo que yo entiendo, tendría que pagar una tarifa de licencia por cada instalación de mi aplicación. Es una aplicación de código abierto para que esto no funcione.
También existe, por ejemplo, la incrustación de intérpretes (IronPython?), Pero no entiendo cómo esto permitiría exponer un "modelo de objetos" (ver más abajo) a guiones externos (o internos).
Sub-preguntas:
- ¿Cuál es la historia de la interfaz de scripting en .NET? ¿Es de alguna manera trivial hacer esto en .NET?
- Por ejemplo, ¿pueden declararse accesibles algunos objetos .NET en mi aplicación y sus objetos contenidos desde el exterior en tiempo de ejecución?
- ¿Cómo pueden acceder las secuencias de comandos externas a mi aplicación (a través del modelo de objetos)?
Fondo:
Una vez, diseñé e implementé una interfaz de script bastante complicada para una aplicación Macintosh para la adquisición y el análisis de datos de un espectrómetro de masas (Mac OS, System 7 ) y luego una interfaz COM para una aplicación de Windows.
Ambos fueron diseñados con un "modelo de objetos" y clases (que pueden tener propiedades). Estas son palabras sobrecargadas, pero en una interfaz de scripting, el modelo de objetos de contexto es esencialmente una jerarquía de contención de objetos de clases específicas. Las clases tienen propiedades, listas de objetos contenidos y no son solo datos, sino que también pueden contener verbos (acciones / métodos). Por ejemplo, en el caso de Macintosh, el objeto de aplicación definido puede contener un objeto de adquisición que tenga propiedades para los voltajes utilizados en el instrumento y un verbo fireLater
, todo como se ve desde el script externo.
Tenga en cuenta que en ambos casos, las clases / objetos en el lenguaje de programación utilizado para implementar la aplicación no tenían nada que ver con el modelo de objetos de scripting. Para el caso de Macintosh, los mecanismos utilizados para implementar la interfaz de scripting fueron definidos por Apple. También hubo algunos estándares definidos por Apple sobre cómo diseñar el modelo de objetos. Por ejemplo, nombres estandarizados para ciertas propiedades comunes en clases.
O como en las interfaces COM expuestas en las aplicaciones de Microsoft Office, donde el objeto de la aplicación se puede usar para agregar a su lista de documentos (con el efecto secundario de crear la representación de la GUI de un documento).
Los scripts externos pueden crear nuevos objetos en un contenedor y navegar a través del contenido de la jerarquía en cualquier momento dado. En Macintosh, los guiones de los casos se pueden escribir en, por ejemplo, AppleScript o Frontier .
En Macintosh, la implementación de una interfaz de scripting fue muy complicada. El soporte en la biblioteca de clases C ++ de Metroworks (el nombre se me escapa ahora) lo hizo mucho más simple.
Eche un vistazo a PowerShell .
Le permite programar cmdlets simples que son secuencias de comandos. También es compatible con contenedores jerárquicos (por defecto tiene el sistema de archivos, el Registro, la tienda de certificados, etc.).
El lenguaje de secuencias de comandos Lua es gratuito, se utiliza en una gran cantidad de aplicaciones comerciales y se puede integrar fácilmente en una aplicación .NET utilizando la biblioteca LuaInterface , que le permite exponer tipos y métodos de su aplicación que los scripts de su intérprete incorporado puede aprovechar.
Un tutorial sobre cómo incrustar Lua en una aplicación C # se puede encontrar here .
Editar: Probablemente también vale la pena señalar que Lua fue diseñado desde cero para ser un lenguaje de scripting incorporado, y como resultado, el intérprete es altamente personalizable. La aplicación host puede restringir casi cualquier aspecto de las capacidades de interpretación como parte del modelo de seguridad; por ejemplo, permitir o evitar que los scripts hagan conexiones de red o escribir en archivos, etc.
Además, preguntaste sobre los guiones externos . Hacer que su programa esté disponible para las secuencias de comandos fuera de proceso se hace de la misma manera que lo hace disponible para las aplicaciones fuera de proceso: al exponer una interfaz de automatización estandarizada a través de algún tipo de protocolo de comunicación. En Windows, para la comunicación entre procesos de la misma máquina, que comúnmente será COM, pero también podría ser WCF, TCP remoto, RPC o cualquier cantidad de otros estándares de comunicación. Lo que elijas hacer depende en gran medida de cómo se construya tu aplicación y qué tipo de automatización externa pretendas que haga.
Implementé CS-Script como última plataforma de scripting para un sistema de flujo de trabajo que escribí. Cada wrokflow necesario tenía diferentes condiciones que dictaban qué usuarios se suscribirían a varias tareas y quién recibiría correos electrónicos. Con un modelo de scripting, fue fácil introducir nuevos pasos en los flujos de trabajo y manejar los requisitos únicos que dichas tareas requerían.
El otro producto agradable del modelo de scripting fue que los flujos de trabajo podían probarse bajo una variedad de condiciones, y se podía tomar un enfoque iterativo para finalizar los comportamientos del flujo de trabajo. Durante el control de calidad y las pruebas de aceptación del usuario, incluí las funciones de registro en los scripts para poder buscar problemas más fácilmente.
Con CS-Script tiene acceso completo a sus objetos; es decir, cuando su script importa sus ensamblajes, puede crear una instancia de su objeto en el código del script. Además, puede conservar sus scripts compilados y simplemente proporcionarles parámetros. Si sus ensamblajes usan un objeto de parámetros o un Diccionario, puede pasar su secuencia de comandos y ejecutar métodos en los objetos contenidos en el objeto de parámetro.
Le sugiero que considere el Dynamic Language Runtime como una estrategia para implementar una interfaz de scripting. Detalles:
El DLR actualmente es compatible con IronPython e IronRuby , además de otras implementaciones de idiomas que se pueden encontrar en CodePlex . Si está interesado en crear un idioma específico para su aplicación, Bitwise Magazine tiene un buen article introducción.
La sesión de PDC09 de Dino Viehland. Usar los lenguajes dinámicos para crear aplicaciones de secuencias de comandos vale la pena. Puede encontrar el código de demostración here .
No estoy seguro de que esto cubra tus necesidades, pero a través de la reflexión puedes compilar código C # y ejecutarlo en tiempo de ejecución (código de ejemplo here ).
Entonces podrías escribir el guión en ej. C # y luego compilarlo "sobre la marcha" y ejecutarlo directamente en el contexto de su aplicación. Por supuesto, debe tener en cuenta las consideraciones de seguridad, pero si los scripts son confiables, podría funcionar para usted y obtendrá los beneficios de utilizar un potente lenguaje administrado para sus scripts.
Si necesita un alto rendimiento o ejecutar miles de scripts, podría ser demasiado lento.
Para obtener un lenguaje de scripting .NET gratuito y fácil de implementar, eche un vistazo a C #.
Vea mi respuesta a una pregunta similar.
En cuanto a la exposición de datos, viendo cómo es un lenguaje .NET, solo necesita agregar su programa en los ensamblajes para vincular y hacer públicas las clases relevantes.
Utilicé CS-Script para crear algo como lo desea. En mi caso, definí una interfaz en mi aplicación. Entonces, un script solo necesitaba implementar esta interfaz para que se pudiera ejecutar desde la aplicación. Mi aplicación consistía en procesar imágenes escaneadas y, por lo tanto, mi interfaz se veía así:
public interface ICustomModule
{
void ProcessBatch(IBatch batch)
}
De esta forma, mi script podría acceder al modelo de objetos que definí en mi aplicación (en mi caso a través de IBatch). Lo bueno fue que durante el desarrollo pude usar un proyecto de biblioteca de clases normal para el guión: IntelliSense, depuración ... No recuerdo los detalles exactos, pero básicamente tuve un cambio en mi aplicación que indicaba a la aplicación que utilizara la clase a la que se hace referencia biblioteca en lugar de un script.
Además, hice una interfaz adicional que permitía configurar las secuencias de comandos: una secuencia de comandos podía definir un conjunto de propiedades que luego mi aplicación visualizaba en una cuadrícula de propiedades. Creo que utilicé esta versión here ya que parecía un poco más flexible en ese momento. De esta forma, no solo puede permitir que los usuarios configuren el script, sino que también puede brindar ayuda en forma de descripciones, opciones, valores predeterminados ... El grid de propiedad es bastante extensible: en un caso, teníamos un script que mostraba un especial formulario para definir algunas configuraciones complejas.
Editar: La aplicación del curso no tenía una referencia a la biblioteca de clases "depurar". Solo necesita cargar el ensamble ...
[EDITAR: como se trata detalladamente en los comentarios al respecto, suponiendo que tiene una necesidad significativa de habilitar secuencias de comandos internas donde está alojando fragmentos o funciones que alguien le da para personalizar su aplicación, en contraposición a un escenario puramente externo donde se proporciona una fachada para permitir que las personas extraigan cosas de tu aplicación de forma más rígida y predefinida]
IronRuby e IronPython son muy claros y apropiados para esto (pero como dice la otra respuesta, PowerShell puede ser apropiado si tiene una cosa más relacionada con la infraestructura).
EDITAR: Otras ideas para habilitar las secuencias de comandos internas son
- utilizando Windows Workflow Foundation (exponiendo actividades a él y / o instalando instancias de flujo de trabajo)
- utilizando el lenguaje de expresión de Spring.NET (que es escueto, fácil de leer y aprender, pero sorprendentemente poderoso)
EDITAR 2 de junio de 2011: IronJS también puede ser un candidato adecuado, hay un Hanselminutes que lo transmite .