Alles rund um die API in EPLAN

WPF API-Addins mit Übersetzungen

Einige unserer Produkte sind auch mehrsprachig. Einige API-Addins besitzen eine GUI mit WPF, welche die Übersetzungen aus einer Resource-Datei in einer referenzierten Assembly laden.

 

Leider gibt es beim Öffnen des Windows dann folgenden Fehler:

The file or assembly LocalizationExample.Translations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null or a dependency of it was not found.
Assembly loader: LocalizationExample.Translations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null not found
The file or assembly LocalizationExample.Translations, PublicKeyToken=null or a dependency of it was not found.
Assembly loader: LocalizationExample.Translations, PublicKeyToken=null not found
The LocalizationExampleAction action with the /_cmdline:LocalizationExampleAction parameters of the LocalizationExample.EplAddIn.Gui module has failed. Could not load file or assembly 'LocalizationExample.Translations, PublicKeyToken=null' or one of its dependencies. Das System kann die angegebene Datei nicht finden.

 

Ich habe mir mit Fusion++ mal angesehen, was nicht geladen wurde:

LOG: Attempting download of new URL file:///C:/Users/moz/AppData/Roaming/EPLAN/ShadowCopyAssemblies/8980/LocalizationExample.EplAddIn.Gui/bin/en-US/LocalizationExample.EplAddIn.Gui.resources.DLL.
LOG: Attempting download of new URL file:///C:/Users/moz/AppData/Roaming/EPLAN/ShadowCopyAssemblies/8980/LocalizationExample.EplAddIn.Gui/bin/en-US/LocalizationExample.EplAddIn.Gui.resources/LocalizationExample.EplAddIn.Gui.resources.DLL.
LOG: Attempting download of new URL file:///C:/Users/moz/AppData/Roaming/EPLAN/ShadowCopyAssemblies/8980/LocalizationExample.EplAddIn.Gui/bin/en-US/LocalizationExample.EplAddIn.Gui.resources.EXE.
LOG: Attempting download of new URL file:///C:/Users/moz/AppData/Roaming/EPLAN/ShadowCopyAssemblies/8980/LocalizationExample.EplAddIn.Gui/bin/en-US/LocalizationExample.EplAddIn.Gui.resources/LocalizationExample.EplAddIn.Gui.resources.EXE.

 

Der Assembly-Loader sucht nach der falschen Datei… mhh, komisch. Denn der Zugriff außerhalb von WPF, sprich im C# Code, funktioniert ohne Probleme.
Meine Vermutung, dass WPF die Resource-Datei nicht findet hat sich betätigt. Darum greife ich nun BEVOR ich ein WPF-Control erstelle, einmal auf die Assembly zu.

Hab das die Lösung auf GitHub mit einem Beispielprojekt dokumentiert.

Von |2021-09-16T08:38:57+02:002021-09-16|EPLAN, EPLAN-API|

EPLAN 2022: Scripting Neuerungen

2021-06-04

Die Betaversion von EPLAN 2022 ist nun verfügbar. Folgende Änderungen an den Actions habe ich aus den News entnommen.

 

2021-08-05

Die API-Hilfe ist nun auch verfügbar und ich habe die Listen ergänzt.

 

EPLAN 2022 ist noch in Beta. Die Actions könnten sich noch ändern.

 

Entfernt

Hinzugefügt

Von |2021-08-05T08:08:41+02:002021-08-04|EPLAN, EPLAN-API, EPLAN-Scripts|

DLLs manuell kopieren

Ab EPLAN 2.6 kopiert EPLAN ja die DLLs welche geladen werden in ein ShadowCopy-Verzeichnis.
Mit dem Interface IEplAddInShadowCopy können wir Einfluss nehmen…

Ich habe ein API-Addin, welches per Entity Framework Daten aus der Datenbank abruft. Komischerweise werden nicht alle DLLs kopiert und werden somit nicht vom AssemblyResolver gefunden.

Über das Interface IEplAddInShadowCopy kopiert dieser Code nun alle DLLs manuell, welche im Orginalverzeichnis vorhanden sind:

public void OnBeforeInit(string strOriginalAssemblyPath)
{
  CopyAssemblies(strOriginalAssemblyPath);
}

private void CopyAssemblies(string originalAssemblyPath)
{
  string sourcePath = Path.GetDirectoryName(originalAssemblyPath);
  DirectoryInfo source = new DirectoryInfo(sourcePath);

  Type type = this.GetType();
  string dllLocation = Assembly.GetAssembly(type).Location;
  string destinationPath = Path.GetDirectoryName(dllLocation);
  DirectoryInfo destination = new DirectoryInfo(destinationPath);

  CopyFilesRecursively(source, destination, ".dll");
}

public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target, string fileExtension = null)
{
  IEnumerable<DirectoryInfo> sourceDirectories = source.GetDirectories();
  foreach (DirectoryInfo sourceDirectory in sourceDirectories)
  {
    DirectoryInfo destinationDir = target.CreateSubdirectory(sourceDirectory.Name);
    CopyFilesRecursively(sourceDirectory, destinationDir);
  }
  IEnumerable<FileInfo> sourceFiles;
  if (string.IsNullOrEmpty(fileExtension))
  {
    sourceFiles = source.GetFiles().ToList();
  }
  else
  {
    sourceFiles = source.GetFiles().Where(obj => obj.Extension.Equals(fileExtension)).ToList();
  }

  foreach (FileInfo sourceFile in sourceFiles)
  {
    string destination = Path.Combine(target.FullName, sourceFile.Name);
    if (!File.Exists(destination))
    {
      sourceFile.CopyTo(destination);
    }
  }
}
Von |2019-10-08T12:30:33+02:002019-10-08|EPLAN, EPLAN-API|