2016-04-28 3 views
3

J'espère que vous pouvez m'aider, car j'ai manqué d'idées. J'utilise Entity Framework 6 dans mon projet qui est bien testé et qui fonctionne parfaitement.Entity Framework ne peut pas être trouvé après la fusion avec ILMerge

Jusqu'à ce que je décide de fusionner everythig dans un fichier .exe. Depuis lors, j'ai des problèmes. Pour cette tâche, j'ai décidé d'utiliser ILMerge. Installé comme un paquet NuGet et a écrit un Ilmerge.CSharp.targets comme ceci:

<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> 

Après une compilation réussie je lance ma solution et obtenir une erreur d'exécution

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.

Toutes les idées? Au fait ... Log4Net ne semble pas fonctionner après la fusion.

Merci pour votre aide!

+0

Vous avez donc encore un exécutable dans votre solution. Avez-vous essayé de configurer les paquets NuGet pour ce projet? (Projet -> Menu contextuel -> "Gérer les paquets NuGet"). Vous devez vous assurer que le framework Entity, Log4Net et les autres packages sont installés pour le projet. – Martin

Répondre

3

Dans votre fichier de configuration (app.config) vous avez probablement quelque chose comme ceci:

<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> 

Notez qu'il existe plusieurs lignes là quels types de référence dans l'assemblage EntityFramework, par exemple:

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

Mais après avoir tout fusionné en un seul assemblage - aucune DLL EntityFramework ne peut plus être trouvée. Vous devez corriger ces références pour pointer vers votre assembly principal à la place. Supposons que votre application .exe s'appelle MergeTest.exe. Ensuite, pour résoudre le problème, remplacer toutes les occurrences de référence EntityFramework à MergeTest:

<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> 

histoire Même avec des références log4net.

+0

Merci pour votre aide, mais maintenant j'obtiens une erreur: 'Une erreur est survenue lors de la création du gestionnaire de section de configuration pour entityFramework: Impossible de charger le fichier ou l'assembly 'MyMerge, Version = 6.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089' ou un de ses dépendances. La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040) 'Que peut-il être? – Julia

+0

Vous devez supprimer la référence entière ("EntityFramework, Version = 6.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089" remplacez par simplement "MyMerge"), donc supprimez le jeton de clé publique, la version et la culture aussi. – Evk

+0

@Julia aussi si votre assembly principal (MyMerge) a un nom fort (donc signé avec snk key) - vous devez remplacer la référence EntityFramework par une référence forte et valide à votre assembly (MyMerge, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = ). – Evk