Как я могу предотвратить настройку встроенного файла ресурсов на основе его имени файла
В проекте VS2015 .NET 4.6.1 у меня есть файл ресурса данных с Build Action, установленным на "Embedded Resource", и именем, которое выглядит следующим образом:
myDataFile.bin.zip
К сожалению, "bin" - это локаль, присутствующая на моем компьютере с Windows 10, в результате чего файл идентифицируется как ресурс для определенной локали, а не как по умолчанию (Visual Studio распознает файлы, названные в формате <name>.<locale>.<ext>
как специфические для региона), что привело к созданию спутниковой сборки.
Это означает, что при сборке я получаю две сборки:
myproject.dll
bin\myproject.resources.dll
Я хочу, чтобы файл был включен в сборку проекта, а не в спутниковую сборку.
Без изменения имени файла это возможно?
Спасибо!
1 ответ
Это поведение реализуется целью сборки SplitResourcesByCulture в Microsoft.Common.CurrentVersion.targets (расположенной в C:\Program Files (x86)\MSBuild\14.0\Bin) и в классе Microsoft.Build.Tasks.AssignCulture. Я посмотрел на исходный код, но не нашел простого переключателя, который можно было бы переключить, чтобы предотвратить неправильное толкование "bin" как названия культуры. Фактически, для проекта C# имя файла остается одним, только когда внедренный ресурс "зависит" от файла с одинаковыми именами.cs.
Итак, если не считать переписывания стандартных целей сборки, у вас есть простой (хотя и немного хакерский) обходной путь:
В папке, где находится myDataFile.bin.zip, добавьте в проект пустой файл кода C# с именем myDataFile.bin.cs. Это имя должно точно соответствовать имени вашего встроенного ресурса , за исключением конечного расширения (.cs вместо.zip). Вы можете оставить файл полностью пустым или добавить комментарий, объясняющий, что происходит:
// This source file prevents the nested myDataFile.bin.zip file from being treated as // a resource for the "bin" culture.
Сохраните проект. (Чтобы файл проекта был сохранен, нажмите "Файл"> "Сохранить все".)
Откройте файл проекта.csproj в текстовом редакторе и найдите
<EmbeddedResource>
элемент для myDataFile.bin.zip:<EmbeddedResource Include="myDataFile.bin.zip" />
Вставить ребенка
<DependentUpon>
элемент, который ссылается на файл кода C#:<EmbeddedResource Include="myDataFile.bin.zip"> <DependentUpon>myDataFile.bin.cs</DependentUpon> </EmbeddedResource>
Сохраните файл проекта и перезагрузите проект в Visual Studio.
Визуально подтвердите в обозревателе решений, что myDataFile.bin.zip вложен в myDataFile.bin.cs.
Постройте проект. Ваш ресурс теперь встроен в основную сборку вместо спутниковой сборки.