Hm.. I've found decision myself. But I still don't know why first code didn't work. Here's working example. As you can see - each keyevent is sent by separate SendInput instead of one keyevent package. Works as i needed.
void SendText(string text)
{
int len = text.Length;
int inputsSize = len * 2;
//INPUT[] inputs = new INPUT[inputsSize];
INPUT[] inputs = new INPUT[1];
for (int i = 0; i < len; i++)
{
INPUT inp = new INPUT();
inp.type = 1; //INPUT_KEYBOARD;
inp.U.ki.dwFlags = KEYEVENTF.UNICODE;
inp.U.ki.time = 0;
inp.U.ki.wVk = 0;
inp.U.ki.wScan = (short)text[i];
inp.U.ki.dwExtraInfo = GetMessageExtraInfo();
//inputs[i] = inp;
inputs[0] = inp;
SendInput(1, inputs, INPUT.Size);
inp = new INPUT();
inp.type = 1; //INPUT_KEYBOARD;
inp.U.ki.dwFlags = KEYEVENTF.KEYUP | KEYEVENTF.UNICODE;
inp.U.ki.time = 0;
inp.U.ki.wVk = 0;
inp.U.ki.wScan = (short)text[i];
inp.U.ki.dwExtraInfo = GetMessageExtraInfo();
//inputs[i + 1] = inp;
inputs[0] = inp;
SendInput(1, inputs, INPUT.Size);
}
//SendInput((uint)inputsSize, inputs, INPUT.Size);
}