2009-01-28 4 views
5

Ich möchte eine von vier separaten C# -Assembladen basierend auf dem Build-Ziel laden. Dies geht in einen Webservice mit .net framework 3.0.Laden verschiedener Assemblies zur Kompilierzeit basierend auf Build Target

Möglichkeiten:

32-Bit-Debug: AmtApiWrapper32d.dll

32-Bit-Version: AmtApiWrapper32.dll

64-Bit-Debug: AmtApiWrapper64d.dll

64-Bit-Version : AmtApiWrapper64.dll

Diese Wrapper sind ein separates C++ - Projekt, das eine C native DLL umschließt, die ich geschrieben habe. C/C++ ist meine übliche Plattform, bitte entschuldigt mich, wenn das eine Nubs Frage ist.

Alle Wrapper-DLLs enthalten genau die gleichen Funktionen und Prototypen. Sie werden für viele andere Zwecke außer diesem verwendet, also wenn das nicht wirklich schrecklich ist, bleibt das Setup dasselbe.

Also, ich möchte eines von ihnen zur Kompilierzeit laden. Ich habe mir Sachen wie Reflektion, GetDelegateForFunctionPointer und einige andere Sachen angeschaut, und sie scheinen alle ähnlich, aber zu kompliziert für diese einfache Aufgabe. Irgendwelche Vorschläge? DANK

Antwort

6

Es ist definitiv möglich, aber Sie müssen in die Build-Datei waten.

Sie würden wollen, so etwas wie:

<ItemGroup Condition=" '$(Configuration)' == '32-bit debug' "> 
    <Reference Include="AmtApiWrapper32d"> 
</ItemGroup> 
<ItemGroup Condition=" '$(Configuration)' == '32-bit release' "> 
    <Reference Include="AmtApiWrapper32"> 
</ItemGroup> 
<ItemGroup Condition=" '$(Configuration)' == '64-bit debug' "> 
    <Reference Include="AmtApiWrapper64d"> 
</ItemGroup> 
<ItemGroup Condition=" '$(Configuration)' == '64-bit release' "> 
    <Reference Include="AmtApiWrapper64"> 
</ItemGroup> 

Ich schlage vor, Sie bedingungslos ein von ihnen bekommen zu arbeiten, und dann genau schauen, was die Referenz aussieht.

Das ist, wenn Sie es als eine Build-Zeitreferenz hinzufügen möchten. Wenn Sie es in einer P/Invoke-Deklaration verwenden möchten, verwenden Sie einfach #if SYMBOL/#endif um das entsprechende Attribut.

+1

SCHLIESSEN! Danke Jon. Hier: \t Zustand =" ' $ (Konfiguration) | $ (Plattform) '==' Release | AnyCPU ' Bedingung = "' $ (Konfiguration) | $ (Plattform) '==' Debug | x64 ' etc –

0

Haben Sie versucht, Pre-Compiler-Direktiven zu verwenden und verschiedene Variablen im Build-Ziel zu definieren?

heißt

#ifdef 32bdebug 
<load dll here> 
#endif 

es etwas gewesen ist, während seit ich C# verwendet, aber dies sollte bei der Kompilierung arbeiten. Es ist eines von C# 's aus C und C++.

+0

Danke, in C/C++ würden Sie LoadLibrary() innerhalb des ifdef verwenden, aber ich brauche die C# Version. Der Vorschlag von Jon Skeet scheint der sauberste Weg zu sein. danke –