2016-04-28 26 views
3

Ich hoffe, Sie können mir helfen, denn mir gingen die Ideen aus. Ich verwende Entity Framework 6 in meinem Projekt, das gut getestet ist und perfekt funktioniert.Entity Framework kann nicht nach dem Zusammenführen mit ILMerge gefunden werden

Bis ich beschloss, alles in eine .exe Datei zusammenzuführen. Seitdem habe ich Probleme. Für diese Aufgabe habe ich mich entschieden, ILMerge zu verwenden. Installiert es als nuget Paket und schrieb ein Ilmerge.CSharp.targets wie folgt aus:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <Target Name="AfterBuild"> 
     <CreateItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)'=='.dll'"> 
     <Output ItemName="AssembliesToMerge" TaskParameter="Include" /> 
     </CreateItem> 
     <PropertyGroup> 
     <ReferenceAssemblies>C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5</ReferenceAssemblies> 
     </PropertyGroup>  
     <Exec Command="&quot;..\packages\ilmerge.2.14.1208\tools\Ilmerge.exe&quot; /out:@(MainAssembly) &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')"/> 
     <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" /> 
    </Target>    
</Project> 

Nach einer erfolgreichen Compilation betreibe ich meine Lösung und erhalten einen Laufzeitfehler

An error occurred creating the configuration section handler for entityFramework: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.

Irgendwelche Ideen? Übrigens ... Log4Net scheint auch nach dem Zusammenführen nicht zu funktionieren.

Danke für Ihre Hilfe!

+0

Sie haben also eine ausführbare Datei in Ihrer Lösung übrig. Haben Sie versucht, die NuGet-Pakete für dieses Projekt zu konfigurieren? (Projekt -> Kontextmenü -> "NuGet-Pakete verwalten"). Hier sollten Sie sicherstellen, dass das Entity-Framework, Log4Net und andere Pakete für das Projekt installiert sind. – Martin

Antwort

3

In der Konfigurationsdatei (app.config) Sie wahrscheinlich so etwas wie diese:

<configuration> 
    <configSections>  
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
    <!-- more stuff here --> 
</configuration> 

Hinweis, dass es dort mehrere Zeilen der Referenztypen in EntityFramework Montag, zum Beispiel:

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 

Aber nachdem Sie alles in eine Assembly zusammengeführt haben, kann keine EntityFramework-DLL mehr gefunden werden. Sie müssen diese Referenzen so korrigieren, dass sie auf Ihre Hauptbaugruppe verweisen. Angenommen, Ihre Anwendung .exe heißt MergeTest.exe. Dann das Problem zu beheben, jedes Vorkommen von EntityFramework Bezug auf MergeTest ersetzen:

<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, MergeTest" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, MergeTest"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, MergeTest" /> 
    </providers> 
    </entityFramework> 
    <!-- More stuff here --> 
</configuration> 

Die gleiche Geschichte mit log4net Referenzen.

+0

Vielen Dank für Ihre Hilfe, aber jetzt bekomme ich einen Fehler: 'Ein Fehler beim Erstellen der Konfigurationsabschnitt Handler für EntityFramework: Konnte Datei oder Assembly nicht laden 'MyMerge, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' oder eins seiner Abhängigkeiten. Die Manifestdefinition der lokalisierten Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040) 'Was kann es sein? – Julia

+0

Sie müssen die gesamte Referenz löschen ("EntityFramework, Version = 6.0.0.0, Culture = Neutral, PublicKeyToken = b77a5c561934e089" ersetzen Sie einfach mit "MyMerge"), also entfernen Sie auch öffentliche Schlüssel Token, Version und Kultur. – Evk

+0

@Julia auch wenn Ihre Haupt-Assembly (MyMerge) starken Namen hat (also mit einem Snk-Schlüssel signiert ist) - Sie müssen die EntityFramework-Referenz durch einen gültigen starken Verweis auf Ihre Assembly ersetzen (MyMerge, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = ). – Evk