Visual Studio 2008 блокирует пользовательские сборки задач MSBuild

typedef struct{
     char name[30];
     char surname[30];
     int age;
} data;

определяет, что data должен быть блоком памяти, который соответствует 60 символам плюс 4 для int *

[----------------------------,------------------------------,----]
 ^ this is name              ^ this is surname              ^ this is age

. Это выделяет память в стеке.

data s1;

Присвоения просто копируют числа, иногда указатели.

Это не работает

s1.name = "Paulo";

, потому что компилятор знает, что s1.name является началом структуры длиной 64 байта, и "Paulo" является char [] длиной 6 байтов (6 из-за чередующихся строк \ 0 в C). Таким образом, пытается назначить указатель на строку в строку.

Чтобы скопировать «Paulo», в структуру в точке name и «Rossi» в структуру в точке surname.

memcpy(s1.name,    "Paulo", 6);
memcpy(s1.surname, "Rossi", 6);
s1.age = 1;

В итоге вы

[Paulo0----------------------,Rossi0-------------------------,0001]

strcpy делает то же самое, но знает о завершении \0, поэтому не требуется жестко закодированная длина.

В качестве альтернативы вы можете определить структуру, которая указывает на char массивы любой длины.

typedef struct {
  char *name;
  char *surname;
  int age;
} data;

Это создаст

[----,----,----]

Теперь это будет работать, потому что вы заполняете структуру указателями.

s1.name = "Paulo";
s1.surname = "Rossi";
s1.age = 1;

Что-то вроде этого

[f 10]

Где 4 и 10 являются указателями.

* N.B. ints и указатели могут быть разных размеров, размеры 4 выше - 32bit в качестве примера.

28
задан abatishchev 9 August 2010 в 08:39
поделиться

2 ответа

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

Мне удалось решить эту проблему самому ...

Нашел это сообщение на форуме от Дэна Мозли , одного из разработчиков MSBuild из Microsoft:

Привет всем ,

К сожалению, это связано с тем, что MSBuild загружает сборки задач в основной домен приложения.CLR не позволяет сборкам выгружаться из домена приложения, так как это позволяет провести важную оптимизацию их часть.

Единственное решение, которое я предлагаю, - это вызвать tomsbuild.exe, чтобы создавать проекты, использующие задачу. Для этого создайте MSBuild.exe <> как внешний инструмент в VS.

Дэн
разработчик в msbuild
DanMoseley - MSFT

Итак, похоже, что для остановки блокировок вы должны запустить новый процесс MSBuild.exe. Это не может быть тот, который работает внутри Visual Studio, потому что при запуске MSBuild он загружает задачи в основной домен приложения Visual Studio, и это никогда не может быть выгружено.

  • создать новый проект MSBuild (.csproj или аналогичный), который переопределяет цель 'Build' и выполняет ваши настраиваемые действия, например;

     
    
     
    
    
  • Добавьте его в Visual Studio, если хотите, но используйте Configuration Manager, чтобы убедиться, что он не встроен в какую-либо конфигурацию. Просто позвольте VS позаботиться об управлении исходным кодом и тому подобном, а не о создании.

  • Отредактируйте файл .csproj проекта, который зависит от Prebuild.csproj . Добавьте цель BeforeBuild , которая вызывает MSBuild с помощью задачи Exec . Это запустит новый процесс, и когда этот процесс завершится, блокировки файлов будут сняты. Пример:

     
      $ (SolutionDir) Prebuild \ Prebuild.csproj 
    
    
     
    
    

Теперь, когда вы строите зависимый проект, он выполняет MSBuild в новом процессе перед запуском компиляции.

26
ответ дан 28 November 2019 в 03:41
поделиться

Можете ли вы отредактировать файлы проекта и включить следующее объявление свойства

<PropertyGroup>
    <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
</PropertyGroup>

Сообщите мне, работает ли это для вас.

4
ответ дан 28 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: