Здесь не должно быть никаких изменений с .NET 3.5 до 4. (и, между прочим, msvcrt.dll не является частью платформы - это библиотека времени выполнения Microsft C ++). Вы уверены, что больше ничего не изменилось в вашем проекте.
Я только что попробовал этот код, который работает и печатает «4», как и ожидалось:
class Test
{
public unsafe static void Main(string[] args)
{
byte[] bytes = new byte[] {70, 40, 30, 51, 0};
fixed(byte* ptr = bytes)
{
int len = strlen(ptr);
Console.WriteLine(len);
}
}
[DllImport("msvcrt.dll")]
private unsafe static extern int strlen(byte* pByte);
}
Мне неясно, почему вы хотите вызывать strlen из управляемого кода, но, конечно, у вас могут быть свои причины. Если вам нужна альтернативная управляемая реализация, вот один вкладыш, который вы можете использовать:
private static int managed_strlen(byte[] bytes)
{
return bytes.TakeWhile(b => b != 0).Count();
}
Конечно, это не относится к многобайтовым (юникодным) символам, но я не думаю, что strlen тоже.