Entity Framework не может быть найден после слияния с ILMerge
Надеюсь, вы сможете мне помочь, потому что у меня закончились идеи. Я использую Entity Framework 6 в своем проекте, который хорошо протестирован и работал просто отлично.
Пока я не решил объединить все в одну .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=""..\packages\ilmerge.2.14.1208\tools\Ilmerge.exe" /out:@(MainAssembly) "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')"/>
<Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>
</Project>
После успешной компиляции я запускаю свое решение и получаю ошибку времени выполнения
Произошла ошибка при создании обработчика раздела конфигурации для entityFramework: не удалось загрузить файл или сборку 'EntityFramework, версия =6.0.0.0, Culture= нейтральный, PublicKeyToken=b77a5c561934e089' или одну из его зависимостей.
Есть идеи? Кстати... Log4Net, похоже, тоже не работает после слияния.
Спасибо за помощь!
1 ответ
В вашем конфигурационном файле (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 dll больше не может быть найдена. Вместо этого вы должны исправить эти ссылки, чтобы они указывали на вашу основную сборку. Предположим, что ваше приложение.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.