В настоящее время у меня есть база кода, написанная на Фортране, а код взаимодействия написан на C#. В коде Фортрана имеется множество структур. Все массивы и строки имеют фиксированный размер. В C# и Fortran существуют повторяющиеся определения этих структур. Например,
Код: Выделить всё
type :: my_type
character(4) :: foo
end type
Код: Выделить всё
[StructLayout(LayoutKind.Sequential)]
public struct MyType
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
byte[] Foo;
}
Мы используем здесь byte[], потому что символ (4) в Фортране представляет собой строку из четырех символов без нулевого терминатора. Это работает хорошо, однако взаимодействовать с кодом C# сложно, потому что вам приходится постоянно преобразовывать byte[] в строку, а также потому, что значение массива по умолчанию равно нулю . Но если я объявлю Foo как строку C#, маршаллер добавит \0 в конец, что нарушит работу Фортрана.
Если я завернул byte[]< /code> в пользовательской структуре я могу объявить неявные преобразования строк:
Код: Выделить всё
[StructLayout(LayoutKind.Sequential)]
public struct MyStringWrapper
{
private byte[] value;
public static implicit operator string(MyStringWrapper w) => Encoding.ASCII.GetString(w.value);
public static implicit operator MyStringWrapper(string s)
{
MyStringWrapper w;
w.value = Encoding.ASCII.GetBytes(s);
return w;
}
}
Но теперь я не знаю, как применять атрибуты в MyType к полям типа MyStringWrapper, чтобы правильно маршалировать базовое значение , как фиксированный буфер. Обратите внимание: не все экземпляры MyStringWrapper будут иметь одинаковый фиксированный размер. Итак, я ищу либо
- способ объявить поля непосредственно как строки и упорядочить их значения ASCII фиксированного размера без нулевых значений. терминаторы
- способ использовать эту оболочку и передавать ей любые атрибуты для маршалинга или что-то еще, что необходимо, чтобы это работало
- что-то еще, чтобы получить это работает
Существует около 200 таких объявлений строк фиксированного размера. Я бы хотел избежать объявления нового типа для каждой длины фиксированной строки, поскольку их несколько десятков.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... enient-way