Laden...

Bedingtes Compilieren in Abhängigkeit von geladenen Assemblies

Erstellt von panicJonny vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.755 Views
P
panicJonny Themenstarter:in
64 Beiträge seit 2011
vor 6 Jahren
Bedingtes Compilieren in Abhängigkeit von geladenen Assemblies

Hallo zusammen,

ich habe da eine Klasse die mir Strings in (fast) beliebige Datentypen umwandelt.
Das klappt erst mal wunderbar mit allen Typen, die eine Parse Methode mitbringen und zusätzlich mit Enums sowie Size und Point ( + die Floatvarianten).

So weit so geht.

Jetzt ist es aber so, dass Point und Size natürlich nach System.Draw verlangen. Das wird ja bei Konsolenanwendungen nicht automatisch als Refezenz eingebunden. Da ich aber keine Lust habe, das jedes mal von Hand zu machen und das dann eh nicht brauche.

Also lange Rede kurze Frage. Hat jemand eine Idee, wie ich dem Compiler beibringe, den entsprechenden Teil zu ignorieren, wenn das Assembly nicht geladen ist?

PS: Falls Code benötigt wird, kann ich ihn gerne reinstellen.

1.040 Beiträge seit 2007
vor 6 Jahren

Klingt ziemlich abgefahren.
Kannst du kurz mal den Anwendungsfall schildern?

771 Beiträge seit 2009
vor 6 Jahren

Kopierst du die Klasse dann immer in verschiedene Projekte? Erzeuge doch einfach aus der Klasse eine eigene Assembly (und binde dort dann System.Drawing ein).

P
panicJonny Themenstarter:in
64 Beiträge seit 2011
vor 6 Jahren

Klingt ziemlich abgefahren.
Kannst du kurz mal den Anwendungsfall schildern?

Sehe ich mal als Kompliment an 😃

Ich habe ein XML Dokument, welches mir etwas zum Ausdrucken beschreibt.

Das sieht z.Bsp. so aus


<object type="text" position="40,106" > 
      <font name="Calibri" size="5.9" style="Bold" />
      <text>Hallo Welt</text>
</object>

Das wird geparst und dann über DrawString gezeichnet. Die Zeichenketten müssen natürlich in den entsprechenden Datentyp gewandelt werden. Das ist ja auch nicht mein Problem.

Die Klasse, welche die Daten parst ist über die Zeit gewachsen und ich möchte sie auch nur in einer Version weiter pflegen.
Ich habe aber nicht in jedem Project "System.Drawing" dabei und will das auch nicht unnötigerweise jedes mal hinzu fügen müssen. Daher will ich den Kram, der "Point" benutzt ohne Compilerfehler weghaben ohne tätig werden zu müssen.

@Cat

die Klasse wird über svn:externals eingebunden. Ich bin kein Fan von zu vielen Dlls in meinen bin Verzeichnissen

16.830 Beiträge seit 2008
vor 6 Jahren

Das bringst Du dem Compiler an für sich gar nicht bei, weil das weder seine Aufgabe ist noch seine Kompetenz.
Da müsstest Du ihn wohl umschreiben.

Das wird ja bei Konsolenanwendungen nicht automatisch als Refezenz eingebunden.

Das wird nirgens automatisch als Referenz eingebunden.
Es ist nur so, dass Visual Studio Templates eben gewisse Referenzen eingebettet haben, damit Du das nicht von Hand machen musst. Aber an für sich passiert hier nichts automatisch.
Programmier mit Notepad++ und MSBuild.exe und Du musst das alles selbst machen.

Im Endeffekt wird Dir wohl nichts anderes übrig bleiben, als einen MSBuild-Wrapper zu schreiben.
Dieser erhält die csproj als Parameter. Dort wird geprüft, ob notwendige Referenzen, die Du selbst irgendwo in Abhängigkeit pflegen musst, vorhanden sind.
Wenn nein, dann wird dei csproj angepasst und MSBuild entsprechend aufgerufen.

Aber an für sich hat der Compiler dafür gar keine Schnittstelle.

Alternativ Versionen sauber über NuGet pflegen, dort System.Drawing als Abhängigkeit deklarieren und mit dem .NET Ökosystem arbeiten.

P
panicJonny Themenstarter:in
64 Beiträge seit 2011
vor 6 Jahren

Schade,

ich hatte gehooft, das man mit #if was machen könnte oder irgend eine andere Variante davon.

Nun gut. Dann werd ich die Klasse doch als zusätzliches Assembly bereitstellen.

Danke für die Infos

16.830 Beiträge seit 2008
vor 6 Jahren

#if Direktiven beziehen sich aber auf Code-Inhalte, nicht auf Assemblies.
Man kann mit Direktiven auch nur deklarieren, was kompiliert werden soll, nicht wie.

P
panicJonny Themenstarter:in
64 Beiträge seit 2011
vor 6 Jahren

#if Direktiven beziehen sich aber auf Code-Inhalte, nicht auf Assemblies.
Man kann mit Direktiven auch nur deklarieren, was kompiliert werden soll, nicht wie.

genau das hat mir ja auch vorgeschwebt. Den Kram einfach nicht kompilieren, wenn das Assembly nicht eingebunden ist 😃

16.830 Beiträge seit 2008
vor 6 Jahren

Naja, so funktionieren halt Direktiven nicht...

D
985 Beiträge seit 2014
vor 6 Jahren

Wenn du aber Graphics.DrawString aufrufen willst und alles in einem Block hast, dann musst du die System.Drawing doch immer referenzieren, egal ob Point oder Size benötigt werden.

Wenn du für neue Konsolenanwendungen das System.Drawing nicht per Hand hinzufügen möchtest (ist eigentlich mit VS2017 mit Strg+. und Enter erledigt) dann erstelle dir ein eigenes Projekt-Template wo diese Referenz schon enthalten ist.

Oder du erstellst dir eben doch DLLs, dann braucht es die System.Drawing nur in der DLL, die mit Graphics arbeitet. Einen eigener Point struct ist ja schnell geschrieben.

W
872 Beiträge seit 2005
vor 6 Jahren

Referenzieren bedeutet nicht laden.
Ich habe ein ähnliches Problem, dass ich in einem Projekt je nach Konfiguration 3rd Party Assemblies brauche, die entweder auf 32 oder 64 Bit Kompilierung angewiesen sind.
Da arbeite ich mit einer Mischung aus #if, verschiedenen Konfigurationen für die Conditional compilation symbole" und Batch Build. Klappt eigentlich ganz gut.
Mit den #if sollte man sparsam umgehen - am besten arbeitet man da mit partial class für das jeweilige Target anstatt seinen ganzen Code mit #if zu versauen.

P
panicJonny Themenstarter:in
64 Beiträge seit 2011
vor 6 Jahren

Moin, falls das irgend wen interessieren sollte^^

ich hab das jetzt über ein manuelles #define useDrawing gelöst. Das auszukommentieren geht immer noch schneller als die blöde referenz zum aus der Liste zu suchen und dem Projekt hintzuzufügen.

Vielen Dank für die vielen Anregungen.