# Openness DLL in der app.config umschalten



## blimaa (7 Januar 2021)

Hi

Ich möchte meine Openness Applikation für verschiedene TIA Versionen gestalten. Nun möchte ich  mal für V15.1 und V16 dies realisieren. Dies geht soweit, wenn ich jeweils im Visual Studio die Verweise auf die Siemens DLL ändere und dann in der App.Config jeweils der den richtigen Pfad entkommentiere und der andere einkommentiere.


```
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>



    <!--TIA Portal Konfiguration-->
    <!--V15.1:-->
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>
            
                <codeBase version="15.1.0.0" href="FILE://C:\MeinPfad\TIA V151 Openness DLL\Siemens.Engineering.dll"/>

            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering.Hmi" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>
            
                <codeBase version="15.1.0.0" href="FILE://C:\MeinPfad\TIA V151 Openness DLL\Siemens.Engineering.Hmi.dll"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>


    <!--V16:-->
    <!--<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>

                <codeBase version="16.0.0.0" href="FILE://C:\MeinPfad\TIA V16 Openness DLL\Siemens.Engineering.dll"/>

            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering.Hmi" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>

                <codeBase version="16.0.0.0" href="FILE://C:\MeinPfad\TIA V16 Openness DLL\Siemens.Engineering.Hmi.dll"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
-->


    <!--V17:-->
    <!--Zukunft-->


    
</configuration>
```

Nun möchte ich im nächsten Schritt nur noch in der App.config entsprechend ent/einkommentieren (so als zwischenschrtitt). Wie kann ich dies machen, damit ich die Verweise nicht immer ändern muss?
Dll auf false bei "lokale Kopie" und aus dem debug Ordner gelöscht habe ich bereits gemacht, nützt aber nichts...   https://support.industry.siemens.com/cs/document/109766015/warum-wird-die-openness-applikation-nicht-mit-der-ausgew%C3%A4hlten-tia-portal-version-gestartet-?dti=0&lc=de-CH


Wer hat damit Erfahrung?

Gruss blimaa


----------



## Jochen Kühner (7 Januar 2021)

kannst mal schauen wie ich das gelöst habe: https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary oder siemens in seinem openess beispiel.
meine bibliothek dient auch als wrapper über einige openess funktionen.


----------



## blimaa (7 Januar 2021)

Hi

Super Besten Dank. Werde ich machen.
Das Openness Beispiel habe ich bei mir nicht zum Laufen bekommen...
Da blicke ich nicht ganz durch. 

Gruss blimaa


----------



## Jochen Kühner (7 Januar 2021)

Was macht denn deine Applikation mit openness?


----------



## blimaa (8 Januar 2021)

Hi
Die erstellt das Grundkonstrukt eines neues Projekts. 
SPS, IO-Link Master,  Servocontrollern etc. gemäs eingelesenen Daten im Projekt einfügen, projektieren und ans Profinetnetzwerke anbinden. 
Entsprechende Bauseine aus der Firmenbibliothek ins Projekt kopieren, gewisse Ansteuerungs Bausteine gemäss eingelesenen Daten generieren. 

Muss sagen, deine Sammlung erschlägt mich fast ein bisschen.. 
Was ich bis jetzt herausgefunden habe (oder besser gesagt erahne):
-unter "DotNetSiemensPLCToolBoxLibrary.TIAV16"

```
AppDomain domain = AppDomain.CreateDomain("another domain");
            CrossAppDomainDelegate action = () =>  
            {  
                var app = new Application();
                var ask = new SelectPortalInstance();
                var p = AppDomain.CurrentDomain.GetData("processes") as string[];
                ask.lstInstances.ItemsSource = p;
                app.Run(ask);
                AppDomain.CurrentDomain.SetData("idx", ask.lstInstances.SelectedIndex);
            };  
            domain.SetData("processes", sLst);
            domain.DoCallBack(action);
            var idx = (int)domain.GetData("idx");
```
 
Hier übergibts du irgend wie welche Version von der DLL genutzt werden soll..... 
Blicke ich jetzt aber noch nicht durch


----------



## Jochen Kühner (8 Januar 2021)

Ich habe eine Wrapper DLL für jede TIA Version, aber in einer gemeinsamen DLL gemeinsame Interfaces.

Dann lade ich die entsprechende DLL hier:
https://github.com/dotnetprojects/D...nnectionLibrary/Projectfiles/Projects.cs#L352

Vlt. reicht es dir aber einfach hier einzuspringen:
https://docs.microsoft.com/de-de/dotnet/api/system.appdomain.assemblyresolve?view=net-5.0

Aber weiß nicht ob die Interfaces sich zwischen den TIA Versionen nicht ändern und du dir wie ich eine Abstraktion schaffen mußt.

Software Im/Export geht mit meiner Abstraktion schon (Siehe https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/tree/master/TiaImporter und https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/tree/master/TiaGitHandler). Hardware hab ich nix gemacht.


----------



## blimaa (8 Januar 2021)

Hi
Die Applikation an sich läuft prima. Ich wollte halt nun noch als topping die TIA Versionen Umschaltung machen.
Besten Dank, ich werde es nochmals genau anschauen.

Gruss blimaa


----------



## Jochen Kühner (8 Januar 2021)

Machst du denn auch Kop/Fup Code Erzeugung? Wie hast du das gelöst?


----------



## blimaa (8 Januar 2021)

Nein, ich habe nur (99%) SCL Bausteine, aber diese kommen direkt 1:1 aus der Bibliothek.
Ich generiere vorerst mal nur Datenbausteine.

Edit:
Für die DB's generiere ich eine Quelle und importiere diese dann ins Projekt.


----------



## blimaa (8 Januar 2021)

In der Openness Doku ist sogar ein Beispiel:

```
static class MyProgram 
    { 
        public static void Main(string[] args) 
        { 
            AppDomain.CurrentDomain.AssemblyResolve += MyResolver; 
            RunTiaPortal(); 
        } 
        private static void RunTiaPortal() 
        { 
            // To start TIA Portal with user interface: 
            // using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))
            // 
            // To start TIA Portal without user interface: 
            // using (TiaPortal tiaPortal = new 
TiaPortal(TiaPortalMode.WithoutUserInterface)) 
            using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface)) 
            { 
                //begin of code for further implementation 
                //... 
                //end of code 
            } 
        } 
        private static Assembly MyResolver(object sender, ResolveEventArgs args) 
        { 
            int index = args.Name.IndexOf(',');
            if (index == -1)
            {
                return null;
            }
            string name = args.Name.Substring(0, index) + ".dll";
            // Edit the following path according to your installed version of TIA Portal
            string path = Path.Combine(@"C:\Program Files\Siemens\Automation\Portal Vxx
\PublicAPI\Vxx\", name);
            string fullPath = Path.GetFullPath(path);
            if (File.Exists(fullPath))
            {
                return Assembly.LoadFrom(fullPath);
            }
            return null;
        }
    }
```

Dies habe ich mal ausprobiert...
Für die referenzierte DLL (V16) gehts, für V15.1 nicht...
(AppConfig ist alles zu TIA auskommentiert)


----------

