Zum Hauptinhalt springen

Andere DLLs einbinden

Wenn Sie in Ihrem Visual Studio Projekt andere DLLs referenzieren, also DLLs die nicht mit MapEdit mitgeliefert werden, dann müssen Sie diese DLLs dem System bekannt geben, anderenfalls wird ihr Plugin diese beim ausführen auf dem Kundenrechner nicht finden und wird ggf ihr Plugin und MapEdit zum Absturz bringen.

Beachten Sie das sie das während dem entwicklen ggf gar nicht merken. Deswegen sollten Sie ihr Plugin immer auf einem nicht Entwicklungsrechner testen.

Warum ist das so

MapEdit hat ein automatisches Softwareupdate System. D.h. MapEdit wird auf dem Server Rechner installiert und alle DLLs werden zum Client (Kundenrechner) kopiert. Wenn MapEdit ihre DLLs nicht kennt, dann landen diese auch nicht auf dem Client und kann dann nicht von ihrem Plugin gefunden/genutzt werden.

Wo sehe ich welche DLLs MapEdit mit ausliefert.

Starten Sie den AppBuilder und öffnen Sie den "Über" Dialog. Klicken Sie auf den Knopf hinter "Local Storage"

Dies öffnet den Datei Explorer und gehen Sie zwei Verzeichnisse zurück und dann in das Verzeichnis "app". Dort finden Sie alle DLLs die MapEdit mitliefert.

Beispiel:

C:\Users\heyho\AppData\Roaming\MapEditDesktop\DevWin2023R2\Repositories\Default
zwei Verzeichnisse hoch und dann in "app"
C:\Users\heyho\AppData\Roaming\MapEditDesktop\DevWin2023R2\app

Alle DLLs die sie dort nicht sehen sind MapEdit nicht bekannt.

Eigene DLLs hinzufügen

Beachten Sie das ihr Plugin dem System bereits bekannt ist. Des weiteren sind MapEdit auch alle Standard .NET Framework Dateien bekannt. Diese befinden sich jedoch nicht in dem oben genannten Verzeichnis.

D.h. sie müssen MapEdit nur DLLs bekanntgeben sie selbst von anderen Herstellern (oder selbst geschriebene) eingebunden haben.

Kopieren Sie die DLL auf dem MapEdit Server Rechner in das MapEdit Repository Verzeichnis unter "Default\Plugins\Assemblies\" und ändern sie die Endung ".dll" nach ".xap" um.

Beispiel:

C:\inetpub\wwwroot\MumGeoData\Repositories\Default\Plugins\Assemblies\

In ihrem Plugin fügen Sie dann den Namen der DLL ohne die Endung hinzu. also ThirdParty wenn sie eine DLL mit dem Namen "ThirdParty.dll" hinzufügen wollen.

Beispiel:

[ReferenceAssembly("ThirdParty")] 
public class ClientPlugIn : Mum.Geo.PlugIns.ClientPlugIn

Sie können auch mehrere DLLS bekannt geben:

Beispiel:

[ReferenceAssembly("ThirdParty")]
[ReferenceAssembly("SAPIntegration")]
[ReferenceAssembly("Meine")]
public class ClientPlugIn : Mum.Geo.PlugIns.ClientPlugIn

Wenn sich der MapEdit Server auf ihrer lokalen Enticklungsmaschine befindet dann können Sie wenn sie eigene DLLs entwickeln die sie in ihre Plugin DLL einbinden wollen, in Visual Studio bei den Postbuild events das kopieren und umbenennen auch automatisiseren z.B.

"$(ProjectDir)..\..\..\CoreDLLs\PostBuildTool.exe" PublishDLL $(TargetPath)

Der Package Updater - Wenn man grosse oder viele Dlls oder andere Dateien hat

Wenn man grosse oder viele Dlls oder andere Dateien hat die man auf dem Client benötigt kann man den Package Updater verwenden.

Der Package Updater prüft ob die Dateien bereits auf dem Client vorhanden sind und läd diese ggf herunter oder updated diese wenn deren Version veraltet ist. Hierbei wird ein Laufbalken angezeigt.

  • Nehmen Sie alle DLLs und Dateien die Sie benötigen und kopieren sie diese in einen Ordner.
  • Zippen Sie diesen Ordner und ändern die die Datei Endung in *.xap um z.B. yourPackage.xap Achten Sie darauf einen eindeutigen Namen zu vergeben. Zum Beispiel dadurch das Sie den Namen ihrer Firma in den Dateinamen mit schreiben.
  • Erzeugen Sie eine Text Datei mit dem gleichen Namen wie die XAP Datei abert mit Endung "*.txt" und schrieben Sie die Zahl 1 in diese Text Datei. Diese Zahl repräsentiert die Versionnummer. Im Fall das Sie die Dateien aktualisieren müssen können Sie hier die Versions Nummer hochsetzen. Der Client weis dann das er die Dateien ggf updaten muss.
  • Ändern Sie die Endung der Text Datei in ".version.xap". Beispiel: yourPackage.version.xap
  • Kopieren Sie Beide Dateien in das Verzeichnis Mum.Geo.Services\DesktopBin\Packages\ auf ihrem Web Server.
  • In Ihrem Plugin Code verwenden Sie die Funktion Mum.Geo.IO.PackageUpdater um ihre Dateien herunterzuladen.
Warnung

Beachten Sie das Sie von Klassen die solche DLL verwenden erst nach dem Laden der DLLs eine Instanz erstellen können da ansonsten .NET diese Dateien nicht findet und einen Fehler wirft. Wenn die Dateien bereits in Benuztung sind kann der Package Updare diese ggf auch nicht beim Update löschen. D.h. der Package Updater sollte vor allem anderen Code ausgeführt werden. Sie sollten den Package Loader erst an der Stelle ausführen wo der Kunde auch wirklich die Funktion ausführt die die Dateien benötigen. z.B. beim drücken eines Knopfes. Damit vermeinden Sie das Dateien unnötig heruntergeladen werden und so den Anwender während dem laden blockieren.

Beispiel:

public void Init()
{

//How to use the PackageUpdater
//1.You grab all the file you need in a folder and zip it
//2.Rename the zip File to yourFile.xap
//3.Copy into D:\VSProjects\MapEdit\Mum.Geo\Mum.Geo.Services\DesktopBin\Packages
//4.Create a text file named yourFile.version.xap in the directory.
//5.Write the number 1 in the text file, for version 1.If you have a new version you have to increase the number, then the client knows that he has to update the files.
//6.Use the Mum.Geo.IO.PackageUpdater to download the Files and load the missing Assemblies over currentDomain.AssemblyResolve


//Always run this. If the Files are already up to date,
//the PackageUpdater will just call UpdateCompleted without downloading anything
Mum.Geo.IO.PackageUpdater packageUpd = new Mum.Geo.IO.PackageUpdater();
packageUpd.UpdateCompleted += PackageUpd_UpdateCompleted;
packageUpd.Update("yourPackage");
}

private void PackageUpd_UpdateCompleted(object sender, Mum.Geo.IO.Events.ExceptionArgs e)
{

//The Folder where you find your Files on the Client Maschine
string folderPath = XApplication.LocalPackagePath + "yourPackage\\";


//Now Load the Assmblies you need into the Memory
Assembly assembly = Assembly.LoadFrom(folderPath + "my.dll");

//Or use the AssemblyResolve (See Microsoft Documentaion)
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(LoadFromSameFolder);
}


private static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{
string folderPath = XApplication.LocalPackagePath + Properties.Resources.zipname + "\\";
string assemblyPath = System.IO.Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");
if(!System.IO.File.Exists(assemblyPath)) return null;
Assembly assembly = Assembly.LoadFrom(assemblyPath);
return assembly;
}

Wenn Sie Dateien in der Package XAP Datei aktualisiseren müssen, setzen Sie in der *.version.xap auf dem Web Server die Versionsnummer hoch. Damit weis der Package Updater das er die Dateien auf dem Client entfernen und aktualisiern muss.