none
Methoden aus der DLL extrahieren

    Frage

  • Hallo,

    ich benutze meine eigene DLL in einem von mir selbstgeschriebenen Programm. Die DLL enthält mehere Methoden, das Programm beutzt aber nur einige davon. Ich muss den gesamten Quellcode weitergeben - nicht obfuscated , würde aber nur ungern die gesamte DLL weitergeben. Besteht die Möglichkeit aus der DLL nur die benutzen Methoden "rauszuziehen"... ?

    Danke für die Antwort,

    Adi

    Donnerstag, 18. April 2019 08:30

Antworten

  • Hi,

    das wird so nicht gehen, um eine manuelle Auslagerung wirst Du nicht umhin kommen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 25. April 2019 08:34
    Moderator
  • Wenn du die Quellen auf von der DLL weitergeben musst, bleibt dir kaum eine andere Möglichkeit, als die 'internen' Methoden komplett (in ein anderes Projekt für eine andere DLL) auszulagern.

    Eine mögliche Alternative wäre möglicherweise noch, mit partial classes zu arbeiten und den 'internen' Teil in einem eigenen File vorzuhalten und diesen dann nicht mit auszuliefern. Hierzu müssten dann aber im Grunde zwei Projekte gepflegt werden, welche die gleichen Quellen beinhalten und einmal zusätzlich eben die 'internen' Files zusätzlich beinhalten.
    Beide Projekte liessen sich dann builden, hätten aber unterschiedlichen Funktionsumfang. gerade, wenn an dem Produkt (der DLL) noch weiterentwickelt wird, ist die Pflege aber ein ordentlicher Zusatzaufwand.

    Das sieht dann in etwa so aus:

    namespace mycustomlibrary
    {
        public partial class Class1
        {
            public string MyMethod()
            {
                return "Hello World";
            }
        }
    }

    namespace mycustomlibrary
    {
        public partial class Class1
        {
            public string InternalMethod()
            {
                return "internal Use Only";
            }
        }
    }

    Sollten die Quellen der DLL nicht mit ausgeliefert werden, kannst du auch eine neue Buildkonfiguration dem Projekt hinzufügen, unter dieser dann in den Properties/Build z.B. 'EXTERNAL_USE' definieren und im Code dann interne Methoden über den Preprocessor 'ausblenden':

    namespace mycustomlibrary
    {
        public class Class1
        {
            public string MyMethod()
            {
                return "Hello World";
            }
    
    #if !EXTERNAL_USE
            public string InternalMethod()
            {
                return "internal Use Only";
            }
    #endif
        }
    }


    Donnerstag, 25. April 2019 12:21

Alle Antworten

  • Hallo Adi,

    Wenn die Anwendung ohne die DLL erstellt wurde, Du darauf nicht verweisen möchtest und eine bestimmte Methode benötigst, so kann sie während der Laufzeit geladen werden. Zu diesem Zweck kannst Du entweder Reflektion oder dynamische Objekte in Anspruch nehmen, um eine Instanz des gewünschten Typs zu erstellen, worauf der erste der drei folgenden Threads näher eingeht. Im letzten Thread bezieht sich das Beispiel auf einen einzigen Typ, in den sonstigen auf alle in der DLL verfügbaren:
    Loading DLLs at runtime in C#
    Dynamically load user controls from a DLL file in C# .net
    Can I load a .NET assembly at runtime and instantiate a type knowing only the Name?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 19. April 2019 08:21
    Moderator
  • Hallo, ich würde gerne diebenötigten Methoden usw. von der DLL extrahieren und eine neue (automatisch) erstellen, da in meiner ursprünglichen DLL sehr viele Methoden enthalten sind, die ich nicht weitergeben möchte.

    Danke für die Antwort!

     
    Donnerstag, 25. April 2019 08:10
  • Hi,

    das wird so nicht gehen, um eine manuelle Auslagerung wirst Du nicht umhin kommen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 25. April 2019 08:34
    Moderator
  • Wenn du die Quellen auf von der DLL weitergeben musst, bleibt dir kaum eine andere Möglichkeit, als die 'internen' Methoden komplett (in ein anderes Projekt für eine andere DLL) auszulagern.

    Eine mögliche Alternative wäre möglicherweise noch, mit partial classes zu arbeiten und den 'internen' Teil in einem eigenen File vorzuhalten und diesen dann nicht mit auszuliefern. Hierzu müssten dann aber im Grunde zwei Projekte gepflegt werden, welche die gleichen Quellen beinhalten und einmal zusätzlich eben die 'internen' Files zusätzlich beinhalten.
    Beide Projekte liessen sich dann builden, hätten aber unterschiedlichen Funktionsumfang. gerade, wenn an dem Produkt (der DLL) noch weiterentwickelt wird, ist die Pflege aber ein ordentlicher Zusatzaufwand.

    Das sieht dann in etwa so aus:

    namespace mycustomlibrary
    {
        public partial class Class1
        {
            public string MyMethod()
            {
                return "Hello World";
            }
        }
    }

    namespace mycustomlibrary
    {
        public partial class Class1
        {
            public string InternalMethod()
            {
                return "internal Use Only";
            }
        }
    }

    Sollten die Quellen der DLL nicht mit ausgeliefert werden, kannst du auch eine neue Buildkonfiguration dem Projekt hinzufügen, unter dieser dann in den Properties/Build z.B. 'EXTERNAL_USE' definieren und im Code dann interne Methoden über den Preprocessor 'ausblenden':

    namespace mycustomlibrary
    {
        public class Class1
        {
            public string MyMethod()
            {
                return "Hello World";
            }
    
    #if !EXTERNAL_USE
            public string InternalMethod()
            {
                return "internal Use Only";
            }
    #endif
        }
    }


    Donnerstag, 25. April 2019 12:21