Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


DLL-plugins

Postades av 2003-11-30 09:54:34 - Thomas Axelsson, i forum c# (c-sharp), Tråden har 16 Kommentarer och lästs av 1031 personer

Jag ska fixa ett sökprg med dll-plugins. Nedan är vad jag fått fram än så länge, men följande problem behöver hjälp med:

- Hur fångar jag vad namespacet heter? Eller finns det nåt annat jag kan göra istället för MyType = MyAssembly.GetType("dynDLL.Class1");???

- Kan pluginen komma åt publika structs och metoder i huvudprg:et? Tänkte bla att ha en public string hämtaSida() och en public string hämtaSidaPOST()

- Hur kommer jag åt publika strängar i pluginen, Assembly.GetFields() eller?

<code>
System.Reflection.Assembly MyAssembly;
MyAssembly = Assembly.LoadFrom(@"d:\thomas mapp\mina dokument\visual studio projects\Exempel - Ladda dll dynamiskt - DLL\bin\release\dyndll.dll");
System.Type MyType;
MyType = MyAssembly.GetType("dynDLL.Class1");

System.Reflection.MethodInfo MyMethod;

MyMethod = MyType.GetMethod("Abs");

Object MyInstance;
MyInstance = Activator.CreateInstance(MyType);
MyMethod.Invoke(MyInstance, null); //new Object[] {-12}
</code>

- MrT


Svara

Sv: DLL-plugins

Postades av 2003-11-30 10:50:45 - Johan Normén

Hej, du kan använda dig av MyAssembly.FullName, GetName() för att få ut all info om den assembly dy dynamiskt läser in. Dock ger den rätt mkt info:
Ex:
Minstrel.Library.Data, Version=1.0.1000.27310, Culture=neutral, PublicKeyToken=n
ull

Ang komma åt huvudprogrammet från din plugin kan nog bli klurigt. Har inte testat att göra så själv,
men ev kan du skicka in form classen in till din plugin och på så vis justera saker för den. Går inte det så kanske du kan hämta de assemlies som ligger i din appdomän...
Det är svårt att ge svar då jag inte vet vad det är du vill komma åt, om det är programmets alla egenskaper eller bara en viss grej, ex textbox.

Denna kod hämtar alla Assemblies som ligger i din AppDomän. Kanske det kan vara något att gå på?
<code>
public static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
Evidence asEvidence = currentDomain.Evidence;

currentDomain.Load("CustomLibrary",asEvidence);

Assembly[] assems = currentDomain.GetAssemblies();

Console.WriteLine("List of assemblies loaded in current appdomain:");
foreach (Assembly assem in assems)
Console.WriteLine(assem.ToString());
}

</code>

Om du kör casting på med dig plugin så kommer du åt dess metoder som om du deklarerade den själv.
<code>
myInstance = (<typen>)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(<info>,<info>);
</code>

Om du skall ha in flera plugins beroende på olika val i din applikation så kan du implementera ett gemensamt interface för dem och på så vis nå en gemensam metod eller property. Annars måste du köra reflection och ta reda på hur classen ser ut.

Jag hoppas detta gav lite information.

Mvh Johan




Svara

Sv: DLL-plugins

Postades av 2003-11-30 21:18:59 - Thomas Axelsson

Okej...

Men hur man tag i en sträng/variabel/objekt i pluginen, tänkte tex ha string namn="Google",string hemsida="http://www.google.com" etc

hur menade du med?

<info>
Om du kör casting på med dig plugin så kommer du åt dess metoder som om du deklarerade den själv.

myInstance = (<typen>)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(<info>,<info>);
</info>

Ska testa det andra imorrn när jag är lite piggare ;)

- MrT


Svara

Sv: DLL-plugins

Postades av 2003-12-01 08:56:30 - Johan Normén

Oj... :-)

Om du kör casting på med dig plugin så kommer du åt dess metoder som om du deklarerade den själv.

skall vara

Om du kör med casting på din plugin så kommer du åt dess metoder som om du deklarerade den själv.

Mvh Johan


Svara

Sv: DLL-plugins

Postades av 2003-12-01 09:30:02 - Johan Bovin

Tänkte bara komma med en grej... vet inte hur du hade tänkt dig att du skulle göra men när man skriver plugins till en del program får ju själva instansen av huvudprogrammet när de laddas.
Dvs du har en klass i din Plugin som implementerar ett Interface (säg IMyApp)
I den finns kanske två metoder
OnStart(MyApp owner);
OnClose();

Sen ser du bara till att din MyApp kallar på OnStart med sig själv som parameter när alla pluginsen laddas in och OnClose innan programmet stängs ner. Då kan du ju kontrollera vilka metoder som pluginen kan använda etc.
Hur man skall hitta rätt klass som implementerar interfacet vet i f-n men det borde ju gå... jag menar du är väl inte först i världen med att skriva en plugin ;-)

Lite tankar bara


Svara

Sv: DLL-plugins

Postades av 2003-12-01 15:42:03 - Thomas Axelsson

öh?

skulle man kunna få ett exempel? Jag är inte så haj på interface o sånt..


Mr T @thomasa88.homeip.net


Svara

Sv: DLL-plugins

Postades av 2003-12-01 16:13:46 - Johan Bovin

tja, hittade inget exempel med just interfaces men här kanske är nåt att utgå ifrån:
http://codeproject.com/csharp/extensibleui.asp
I det exemplet skulle man ju t.ex. kunna lägga till en metod i Plugin klassen som hette OnStart(Form frm)
Som du kallar på i AddPlugin enligt exemplet:
NewPlugin.OnStart(this);

Vet inte om det är detta du söker men det är så en del applikationer fungerar när man skriver plugins till dem iallafall. Vet inte om nån har nån länk om hur man egentligen bör göra sin arkitektur i såna här lägen. Sitter med ungefär samma grejer, att jag nån gång i framtiden vill kunna skriva plugins till mitt eget program...


Svara

Sv: DLL-plugins

Postades av 2003-12-01 17:37:17 - Johan Normén

Varför skulle inte detta vara ett bra sätt? Tycker det verkar fungera. Man skickar med huvudprogrammet ex sin form in i sin plugin som då kan nå formulärets publika metoder m.m.

<code>
NewPlugin.OnStart(this);
</code>

Det som kan vara kul är väl mer registeringshantering av pluggar, så de dynamiskt går att slänga på eller av. Kanske en XML fil som hantererar pluggarna eller vad som..

Mvh Johan


Svara

Sv: DLL-plugins

Postades av 2003-12-01 19:29:24 - Thomas Axelsson

Fatta inte riktigt det där me onstart :P (är man tonåring så är man)

Såg iaf att de hade en pluginlib i exemplet, det var ju en asbra ide :D

- net.MrT


Svara

Sv: DLL-plugins

Postades av 2003-12-01 19:29:56 - Thomas Axelsson

Fatta inte riktigt det där me onstart :P (är man tonåring så är man)

Såg iaf att de hade en pluginlib i exemplet, det var ju en asbra ide :D

- net.MrT


Edit.
ajdå, servern svara inte så jag skicka igen


Svara

Sv: DLL-plugins

Postades av 2003-12-01 23:17:31 - Johan Normén

OnStart var bara en metod som man angett skall vara obligatorisk på sina plugins. Den utför saker när du startar din plugin. OnStart finns troligen med som krav i ett interface, ex

interface IPlugin
{
bool OnStart...

På så vis kan du starta vilket plugin som helst via ex en controller klass eller vad du nu vill bygga. Kanske det är din main metod som skall läsa in dina plugins och starta upp dem?

<code>
public static Main(.....)
{
<läs in plugins DLLerna dynamiskt från ex en pluginmapp....>
<starta alla plugins>
plugin1.OnStart(this);
plugin2.OnStart(this);
plugin3.OnStart(this);
}
</code>
OBS! Bara kladdkod, här kanske du skall köra en loop som skapar varje instans av dina pluggar och starta dem. Du kan strunta i OnStart och skapa en generell konstruktor om du vill oxå.. OnStart ger mer spårbarhet i koden och en mall hur andra ex kan bygga egna plugga och kasta in dem till din programvara.

Mvh Johan



</code>


Svara

Sv: DLL-plugins

Postades av 2003-12-02 09:01:22 - Johan Bovin

Ok, har satt ihop ett litet exempel.
Det består egentligen utav tre assemblies.
Ett huvudprogram (en winexe)
Ett Interface classlibrary (Plugin)
En plugin classlibrary (MyPlugin)

Interfacet (Plugin.IPlugin)
<code>
using System;
using System.Windows.Forms;

namespace Plugin
{
public interface IPlugin
{
void OnStart(Form owner);
void Close();
}
}
</code>

Plugin som refererar till assemblyn Plugin
<code>
using System;
using System.Windows.Forms;
using Plugin;
namespace MyPlugin
{
/// <summary>
/// Summary description for Plugin.
/// </summary>
public class Plugin:IPlugin
{
public Plugin()
{

}
public void OnStart(Form frm)
{
MessageBox.Show(frm.Text);
}
public void Close()
{
MessageBox.Show("Close");
}
}
}
</code>
En WinExe där jag la en referens till Plugin oxå. Sedan bestämde jag att jag skulle ladda alla mina plugins från directoriet "Plugins" som skulle ligga i samma directory som min exe. Detta är huvudprogrammet:
<code>
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using Plugin;
namespace MyApp
{
/// <summary>
/// Summary description for MyForm.
/// </summary>
public class MyForm : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public MyForm()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

CheckPlugins();
}
private void CheckPlugins()
{
string path=Path.Combine(Environment.CurrentDirectory,"Plugins"); //leta i directoriet "Plugins"
string[] files=Directory.GetFiles(path,"*.dll"); //kolla bara efter dll:er
for(int i=0;i<files.Length;i++)
{
LoadPlugin(files[i]);
}
}
private bool IsInterface(Type type, string interfacename)
{
Type itype=type.GetInterface(interfacename);
if(itype!=null)return true;
else return false;
}
private void LoadPlugin(string path)
{
Assembly asm=Assembly.LoadFrom(path);
Type[] types=asm.GetTypes();
for(int i=0;i<types.Length;i++)
{
if(types[i].IsClass && IsInterface(types[i],"Plugin.IPlugin")) //kolla om det är en klass och implementerar Plugin.IPlugin
{
object obj=asm.CreateInstance(types[i].FullName); //skapa en instans
if(obj!=null)
{
IPlugin plugin=(Plugin.IPlugin)obj;
plugin.OnStart(this);//anropa onstart OBS här vill man kanske spara sin plugin nånstans oxå, typ i en arraylist eller nåt
}
}
}
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "MyForm";
}
#endregion
}
}

</code>
Så nånting skulle man ju kunna göra...

Hoppas det kan vara till nån hjälp... kanske man skulle kunna skriva en artikel om sånt här...


Svara

Sv: DLL-plugins

Postades av 2003-12-02 11:56:11 - Johan Normén

"kanske man skulle kunna skriva en artikel om sånt här..."

Det tycker jag du kan göra, det är rätt få artiklar som kommer in, och många kommer nog tycka detta är intressant, tror du inte det?


Svara

Sv: DLL-plugins

Postades av 2003-12-02 12:01:48 - Johan Bovin

hehe.. jo, man ska ju ha tid oxå... får se, kanske blir lite tid över nu under jul


Svara

Sv: DLL-plugins

Postades av 2003-12-03 17:28:09 - Thomas Axelsson

Fint exempel, håller på att försöka fixa in det, men jag får ett fel när jag
-----------------------------

Ajdå hade ingen reference till System.Windows.Forms :P Add...

Mr T @thomasa88.homeip.net


Svara

Sv: DLL-plugins

Postades av 2003-12-03 19:44:02 - Thomas Axelsson

Lite dum fråga kanske, men hur får jag in pluginsen i en lista?

Jag skriver:

Plugin.IPlugin[] plgs;

men när jag försöker initera det med

plgs=new

ploppar inte IPlugin upp under Plugin, och Plugin kan man inte välja.. (kompilationsfel)


Edit.

Ok, jag fick in dem i en Arraylist, men hur får jag ut en sträng ur pluginen. Har försökt med

Edit.

Fick det att funka med

interface:
<code>
string name
{
get;
}
</code>
plugin-class
<code>
public string name
{
get
{
return "TestPlugin";
}
}
</code>

<info>
Finns det nåt enklare sätt, tex nåt me string name; i interfacet och i constructorn i pluginen name="TestPlugin";?
<info>


- MrT


Svara

Sv: DLL-plugins

Postades av 2003-12-05 20:30:27 - Thomas Axelsson

Nu har jag fått till ett litet klurigt problem:

Jag har i namespacet interfacet IPlugin, men nu har jag också en struct som heter hit. Det är tänkt att pluginen ska stoppa sina sökresultat där. Nu till problemet: hit ska kunna returnera en sträng med data genom en funktion kallad string getHit() som ska finnas i structen hit. Så långt är allt väl, men nu är det meningen att de olika pluginsen ska ha olika getHit(), eftersom de söker olika sidor. Hur fixar jag ihop det här nu?

Edit.

Kanske smartare att köra med olika variabler som får datan när hit:en skapas..?

- MrT


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 155
27 952
271 704
6 025
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies