2016-04-28 2 views
3

Надеюсь, вы можете мне помочь, поскольку у меня кончились идеи. Я использую Entity Framework 6 в своем проекте, который хорошо протестирован и отлично работает.Entity Framework не может быть найден после слияния с ILMerge

До тех пор, пока я не решил объединить каждый файл в один файл .exe. С тех пор у меня проблемы. Для этой задачи я решил использовать ILMerge. Установлен как пакет NuGet и написал Ilmerge.CSharp.targets так:

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

После успешной компиляции я бегу мое решение и получить сообщение об ошибке выполнения

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.

Любые идеи? Кстати ... Log4Net тоже не работает после слияния.

Спасибо вам за помощь!

+0

Итак, у вас есть один исполняемый файл в вашем решении. Попробовали ли вы настроить пакеты NuGet для этого проекта? (Проект -> Контекстное меню -> «Управление пакетами NuGet»). Здесь вы должны убедиться, что инфраструктура Entity, Log4Net и другие пакеты установлены для проекта. – Martin

ответ

3

В файле конфигурации (app.config), вы, скорее всего, что-то вроде этого:

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

Заметьте, что есть несколько строк, которые там ссылочные типы в сборке EntityFramework, например:

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

Но после того, как вы объединили все в одну сборку - никакая библиотека EntityFramework не найдена. Вы должны исправить эти ссылки, чтобы указать на вместо вашей основной сборки. Предположим, что ваше приложение .exe называется MergeTest.exe. Затем, чтобы исправить эту проблему, замените все вхождения 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> 

Та же история и со ссылками Log4Net.

+0

Спасибо за вашу помощь. Но теперь я получаю сообщение об ошибке: «Произошла ошибка при создании обработчика раздела конфигурации для entityFramework: не удалось загрузить файл или сборку« MyMerge, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 »или один его зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040) 'Что это может быть? – Julia

+0

Вы должны удалить целую ссылку («EntityFramework, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089» заменить только «MyMerge»), поэтому удалите токен открытого ключа, версию и культуру. – Evk

+0

@Julia также, если ваша основная сборка (MyMerge) имеет сильное имя (так что подписан ключ snk) - вам нужно заменить ссылку EntityFramework на действительную сильную ссылку на вашу сборку (MyMerge, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = ). – Evk

Смежные вопросы