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 в качестве примера.
( Изменить: Сайед Ибрагим Хашими , который буквально написал книгу на 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 в новом процессе перед запуском компиляции.
Можете ли вы отредактировать файлы проекта и включить следующее объявление свойства
<PropertyGroup>
<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
</PropertyGroup>
Сообщите мне, работает ли это для вас.