Startseite > Newsgroups > dotnetpro.public.programming > Thema "Frage zu Activator.CreateInstance"

Thema "Frage zu Activator.CreateInstance"

ThemaAutorDatum
Frage zu Activator.CreateInstance Michael Reukauff 02.11.2004 14:51
» Re: Frage zu Activator.CreateInstance Joachim Fuchs 02.11.2004 22:19
» Re: Frage zu Activator.CreateInstance Michael Reukauff 02.11.2004 23:17
» Re: Frage zu Activator.CreateInstance Joachim Fuchs 03.11.2004 10:14
» Re: Frage zu Activator.CreateInstance Michael Reukauff 03.11.2004 11:34
» Re: Frage zu Activator.CreateInstance thomas greif 17.12.2004 21:32
» Re: Frage zu Activator.CreateInstance thomas greif 17.12.2004 21:32

Frage zu Activator.CreateInstance

02.11.2004 14:51

Michael Reukauff

Antworten

Hallo

Ich bekomme immer eine InvalidCastException mit Specified cast is not valid.
und weiss nicht warum

Ich möchte gerne Plugins dynamisch laden. Alle Plugins stehen in einem
bestimmten Verzeichnis. Alle Assemblies sind von PluginInterface.IPlugin
abgeleitet.

Assembly pluginAssembly = Assembly.LoadFrom(file);
//Next we'll loop through all the Types found in the assembly
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic) //Only look at public types
{
if (!pluginType.IsAbstract) //Only look at non-abstract types
{
//Gets a type object of the interface we need the plugins to match
Type typeInterface =
pluginType.GetInterface("PluginInterface.IPlugin", true);
//Make sure the interface we want to use actually exists
if (typeInterface != null)
{
IPlugin plug = (IPlugin)Activator.CreateInstance(pluginType);
weiteres coding .......
}
}
}
}

Ein rudimentäres Beispiel für ein Plugin:

using System;
using PluginInterface;

namespace Plugin1
{
public class Plugin : IPlugin
{
public Plugin()
{
return;
}
public Initialize()
{
}
}
}

Hier das Interface
using System;

namespace PluginInterface
{
public interface IPlugin
{
void Initialize(); // initialize the form of the plugin
}
}

 
 

Re: Frage zu Activator.CreateInstance

02.11.2004 22:19

Joachim Fuchs

Antworten

Hallo Michael,

wenn der Cast nicht funktioniert, überprüfe mit dem Debugger Typname und vor
allem ID (Type.GUID) des Interfaces. Also sowohl die des dynamisch geladenen
als auch die von IPlugin. Beide Assemblies müssen die gleiche Version der
Assembly referenzieren, in der das Interface definiert ist. Typen mit
unterschiedlicher GUID passen nicht zueinander, auch wenn Namespace und Name
identisch sind.

Gruß
Joachim
--

http://www.fuechse-online.de
http://vbnet.codebooks.de

 
 

Re: Frage zu Activator.CreateInstance

02.11.2004 23:17

Michael Reukauff

Antworten

Hallo Joachim

Danke für die schnelle Antwort. Ich habe zur Zeit alles in einer Solution,
also das Interface, die Host-Application und das Plugin. Wenn ich dann
umwandele werden alle drei neu umgewandelt. Sie müssten also schon gleich
sein. Wie bekomme ich denn die Guid des Interfaces an sich raus? Die des
geladenen Plugins rauszubekommen ist ja einfach. Bin noch relativ neu auf
diesem Gebiet.

Danke nochmals
Michael

"Joachim Fuchs" wrote in message
news:4187fc50$1@news.basicworld.com...
> Hallo Michael,
>
> wenn der Cast nicht funktioniert, überprüfe mit dem Debugger Typname und
vor
> allem ID (Type.GUID) des Interfaces. Also sowohl die des dynamisch
geladenen
> als auch die von IPlugin. Beide Assemblies müssen die gleiche Version der
> Assembly referenzieren, in der das Interface definiert ist. Typen mit
> unterschiedlicher GUID passen nicht zueinander, auch wenn Namespace und
Name
> identisch sind.
>
> Gruß
> Joachim
> --
>
> http://www.fuechse-online.de
> http://vbnet.codebooks.de
>
>

 
 

Re: Frage zu Activator.CreateInstance

03.11.2004 10:14

Joachim Fuchs

Antworten

Hallo Michael,

wenn alles in einer Solution ist (DLL), sollte es eigentlich funktionieren.
Dann überprüfe an der Stelle, an der es schiefgeht, die Typen:

if (typeInterface != null)
{
Debug.WriteLine(pluginType.Fullame)
....pluginType.GUID
....typeof(IPlugin).Fullname
....typeof(IPlugin).GUID

IPlugin plug = (IPlugin)Activator.CreateInstance(pluginType);
weiteres coding .......
}

Gruß
Joachim
--

http://www.fuechse-online.de
http://vbnet.codebooks.de

 
 

Re: Frage zu Activator.CreateInstance

03.11.2004 11:34

Michael Reukauff

Antworten

Hallo Joachim

Genau das wars. Vielen Dank. Ich hatte im Verzeichnis des Plugins noch eine
ältere Version der Interface-DLL. Da kann man lange im Code wühlen und nicht
richtig vorankommen.

Tschüß
Michael

"Joachim Fuchs" wrote in message
news:4187fc50$1@news.basicworld.com...
> Hallo Michael,
>
> wenn der Cast nicht funktioniert, überprüfe mit dem Debugger Typname und
> vor
> allem ID (Type.GUID) des Interfaces. Also sowohl die des dynamisch
> geladenen
> als auch die von IPlugin. Beide Assemblies müssen die gleiche Version der
> Assembly referenzieren, in der das Interface definiert ist. Typen mit
> unterschiedlicher GUID passen nicht zueinander, auch wenn Namespace und
> Name
> identisch sind.
>
> Gruß
> Joachim
> --
>
> http://www.fuechse-online.de
> http://vbnet.codebooks.de
>
>

 
 

Re: Frage zu Activator.CreateInstance

17.12.2004 21:32

thomas greif

Antworten

denke mal dein pronlem is:
pluginType.GetInterface("PluginInterface.IPlugin", true);

probiers mal mit GetType(..)

ein bsp gibts unter :
http://www.codeproject.com/csharp/C__Plugin_Architecture.asp

thomas


Michael Reukauff schrieb am 02.11.2004 um 14:51 in "Frage zu Activator.CreateInstance":
> Hallo
>
> Ich bekomme immer eine InvalidCastException mit Specified cast is not valid.
> und weiss nicht warum
>
> Ich möchte gerne Plugins dynamisch laden. Alle Plugins stehen in einem
> bestimmten Verzeichnis. Alle Assemblies sind von PluginInterface.IPlugin
> abgeleitet.
>
> Assembly pluginAssembly = Assembly.LoadFrom(file);
> //Next we'll loop through all the Types found in the assembly
> foreach (Type pluginType in pluginAssembly.GetTypes())
> {
> if (pluginType.IsPublic) //Only look at public types
> {
> if (!pluginType.IsAbstract) //Only look at non-abstract types
> {
> //Gets a type object of the interface we need the plugins to match
> Type typeInterface =
> pluginType.GetInterface("PluginInterface.IPlugin", true);
> //Make sure the interface we want to use actually exists
> if (typeInterface != null)
> {
> IPlugin plug = (IPlugin)Activator.CreateInstance(pluginType);
> weiteres coding .......
> }
> }
> }
> }
>
> Ein rudimentäres Beispiel für ein Plugin:
>
> using System;
> using PluginInterface;
>
> namespace Plugin1
> {
> public class Plugin : IPlugin
> {
> public Plugin()
> {
> return;
> }
> public Initialize()
> {
> }
> }
> }
>
> Hier das Interface
> using System;
>
> namespace PluginInterface
> {
> public interface IPlugin
> {
> void Initialize(); // initialize the form of the plugin
> }
> }
>
>

 
 

Re: Frage zu Activator.CreateInstance

17.12.2004 21:32

thomas greif

Antworten

denke mal dein pronlem is:
pluginType.GetInterface("PluginInterface.IPlugin", true);

probiers mal mit GetType(..)

ein bsp gibts unter :
http://www.codeproject.com/csharp/C__Plugin_Architecture.asp

thomas


Michael Reukauff schrieb am 02.11.2004 um 14:51 in "Frage zu Activator.CreateInstance":
> Hallo
>
> Ich bekomme immer eine InvalidCastException mit Specified cast is not valid.
> und weiss nicht warum
>
> Ich möchte gerne Plugins dynamisch laden. Alle Plugins stehen in einem
> bestimmten Verzeichnis. Alle Assemblies sind von PluginInterface.IPlugin
> abgeleitet.
>
> Assembly pluginAssembly = Assembly.LoadFrom(file);
> //Next we'll loop through all the Types found in the assembly
> foreach (Type pluginType in pluginAssembly.GetTypes())
> {
> if (pluginType.IsPublic) //Only look at public types
> {
> if (!pluginType.IsAbstract) //Only look at non-abstract types
> {
> //Gets a type object of the interface we need the plugins to match
> Type typeInterface =
> pluginType.GetInterface("PluginInterface.IPlugin", true);
> //Make sure the interface we want to use actually exists
> if (typeInterface != null)
> {
> IPlugin plug = (IPlugin)Activator.CreateInstance(pluginType);
> weiteres coding .......
> }
> }
> }
> }
>
> Ein rudimentäres Beispiel für ein Plugin:
>
> using System;
> using PluginInterface;
>
> namespace Plugin1
> {
> public class Plugin : IPlugin
> {
> public Plugin()
> {
> return;
> }
> public Initialize()
> {
> }
> }
> }
>
> Hier das Interface
> using System;
>
> namespace PluginInterface
> {
> public interface IPlugin
> {
> void Initialize(); // initialize the form of the plugin
> }
> }
>
>

Login
Sie sind nicht eingeloggt.

Login & Registrierung
Abo bestellen










Newsletter
Tragen Sie Ihre E-Mailadresse für den kostenlosen Newsletter von dotnetpro ein.


Umfrage
Was hindert Sie daran, ein Projekt zu beenden?






Ergebnis anzeigen