Единственное, что имеет смысл, это то, что ваш код C # на самом деле:
[DllImport("mydll.dll", CharSet = Unicode)]
private static extern int SetUserPassword(String user, String password);
Когда вы делаете это, вы передаете в код C ++ строку на основе широких символов и, поскольку она ожидает однобайтовые символы, она интерпретирует 0 байт во второй половине первых двухбайтовых символов как терминатор строки.
Вы должны написать:
[DllImport("mydll.dll", CharSet = Ansi)]
private static extern int SetUserPassword(String user, String password);
Или на самом деле вы могли бы написать это точно так же, как в своем вопросе, потому что Ansi
является значением по умолчанию.
И на самом деле оказывается, что вы используете CE, который не поддерживает набор символов Ansi
, и поэтому единственное разумное решение - заставить ваш код C ++ принимать строки широких символов.