Raúl
Moderator
 Moderator
| Posts: 434 |  | Karma: 6
|
Re:Duda sobre los partners - 2008/10/09 21:08
Hola,
Fíjate que lo que hace Visual Studio cuando le das a ejecutar es llamar al nodo DSS pasándole como parámetro un archivo manifest. Concretamente si miras en las propiedades de proyecto, en la solapa de depuración verás algo de este estilo:
| Code: | Start external program:
C:Microsoft Robotics Studio (1.5)binDssHost.exe
Start options:
-port:50000 -tcpport:50001 -manifest:"AppsUC3MCraniumDashboardCraniumDashboard.manifest.xml"
|
Esto quiere decir que cuando ejecutes este proyecto de VS se llama al nodo DSS (DssHost.exe) y se le indica que arranque los servicios especificados en el manifiesto que se le pasa como parámetro (Start Options).
Normalmente, cada proyecto individual de un servicio tiene un manifest que contiene sólo ese servicio, con lo que si le das a ejecutar sólo lanza el propio servicio. Pero puede darse el caso, como tú indicas, en el que una solución de VS contiene varios proyectos (o no los contiene, pero hace referencia a los correspondientes ensamblados) y lo que hace es indicar como parámetro para el nodo DSS un archivo de manifest que arranca inicialmente todos los servicios necesarios.
De todas formas, éste no es el único método para arrancar servicios en MSRS. De hecho, cuando creas entidades de simulación, probablemente en un servicio que tengas que crea el mundo simulado, creas al vuelo los servicios asociados a cada entidad. Por ejemplo, si miras mi código MazeSimulatorRA, verás cómo creo, entre otros, el servicio Differential Drive usando el método CreateService:
| Code: | drive.Contract.CreateService(ConstructorPort,
Microsoft.Robotics.Simulation.Partners.CreateEntityPartner(
"http://localhost/" + robotBaseEntity.State.Name)
);
|
Analogamente hago (de una forma más simple) para crear el servicio de Sonar, asociado a una entidad de sonar simulada:
| Code: | CreateService(
pxsonar.Contract.Identifier,
Microsoft.Robotics.Simulation.Partners.CreateEntityPartner(
"http://localhost/" + sonar.State.Name)
);
|
Esto hace que se creen los servicios sin que estén especificados en el archivo manifest. Simplemente se crean cuando se ejecutan estas líneas de código de otro servicio.
Como ya he creado los servicios de sonar y de tracción diferencial durante la ejecución del servicio de simulación de laberintos, cuando quiera usar el sonar o el diffDrive desde un servicio de control, sólo tengo que especificar que son partners así:
| Code: | // Drive Partner
[Partner("Drive", Contract = pxdrive.Contract.Identifier, CreationPolicy = PartnerCreationPolicy.UseExisting)]
pxdrive.DriveOperations _drivePort = new pxdrive.DriveOperations();
pxdrive.DriveOperations _driveNotify = new pxdrive.DriveOperations();
// Sonar Partner
[Partner("Sonar", Contract = pxsonar.Contract.Identifier, CreationPolicy = PartnerCreationPolicy.UseExisting)]
pxsonar.SonarOperations _sonarPort = new pxsonar.SonarOperations();
pxsonar.SonarOperations _sonarNotify = new pxsonar.SonarOperations();
|
Si te fijas, como en este caso los servicios ya estarán creados, el atributo de creación que uso es UseExisting. Pero en otros casos podría usar UseExistingOrCreate o CreateAlways para forzar a que se cree el servicio indicado.
Raúl Arrabales Moreno. conscious-robots.com/raul |