Как я могу предотвратить настройку встроенного файла ресурсов на основе его имени файла

В проекте 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.

Итак, если не считать переписывания стандартных целей сборки, у вас есть простой (хотя и немного хакерский) обходной путь:

  1. В папке, где находится 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.
    
  2. Сохраните проект. (Чтобы файл проекта был сохранен, нажмите "Файл"> "Сохранить все".)

  3. Откройте файл проекта.csproj в текстовом редакторе и найдите <EmbeddedResource> элемент для myDataFile.bin.zip:

    <EmbeddedResource Include="myDataFile.bin.zip" />
    
  4. Вставить ребенка <DependentUpon> элемент, который ссылается на файл кода C#:

    <EmbeddedResource Include="myDataFile.bin.zip">
      <DependentUpon>myDataFile.bin.cs</DependentUpon>
    </EmbeddedResource>
    
  5. Сохраните файл проекта и перезагрузите проект в Visual Studio.

  6. Визуально подтвердите в обозревателе решений, что myDataFile.bin.zip вложен в myDataFile.bin.cs.

  7. Постройте проект. Ваш ресурс теперь встроен в основную сборку вместо спутниковой сборки.

Другие вопросы по тегам