К сожалению, ответ не может быть определен только по типу. Если бы это было так просто, были бы синтаксические анализаторы, которые могли бы написать родную оболочку для вас. Тип, который вы должны использовать, зависит от того, что фактически выполняет функция.
В вашем случае char *
не помечен const
, и он принимается в качестве параметра, что подразумевает, что он предназначен для выделенной пользователем области памяти, доступной для функции для записи. Поскольку нет параметра размера, скорее всего, максимальный размер, который может содержать строка версии, которая должна быть указана в документации на код. должен указывать.
Учитывая, что это обработка строк, вам также нужно беспокоиться о кодировании. Ради простоты я собираюсь предположить (и надеюсь), что ваша строка находится в ASCII/Windows-1252, а не UTF8, UTF7 или какой-либо другой формат.
Учитывая эти предположения, у вас есть несколько вариантов, но я буду представлять только предпочтительный способ обработки этого на основе предоставленной информации.(Это может быть, что ваша ситуация требует что-то другое, но это лучшее решение, которое я могу предложить на основе asumptions выведенного из информации в вашем вопросе.)
[DllImport("class.dll", EntryPoint = "CLASS_Version", , CharSet = CharSet.Ansi)] // CharSet is important
private static extern void CLASS_Version(StringBuilder Version);
Это «правильный» способ справиться с ситуацией - полагайтесь на компилятор, чтобы обработать маршаллинг для вас. Однако одно небольшое предостережение заключается в том, что вы должны вручную установить емкость StringBuilder, прежде чем передавать его методу.
// be sure to allocate a correct size,
// there will be no error if it overflows because it's too small
StringBuilder buffer = new StringBuilder(size);
// automagically marshalled to and from unmanaged code byt the compiler
CLASS_Version(buffer);
string version = buffer.ToString();
Я хотел бы воспользоваться этой возможностью, чтобы указать на то, что CLASS_Version
не должно быть private
. Все ваши собственные методы должны быть сделаны public
и сгруппированы вместе в одном internal static class
.
Некоторые дополнительные ресурсы о струнной сортировочных, которые вы можете найти под рукой: https://limbioliong.wordpress.com/2011/11/01/using-the-stringbuilder-in-unmanaged-api-calls/
Почему не просто 'string'? –
Потому что строка не изменена. Вы должны передать StringBuilder с достаточной емкостью. Нет * ref * или * out *. И произнесите небольшую молитву о том, что она не испортит кучу GC, не поставит ее в цель. –
Для начала я хотел бы указать, что 'EntryPoint' должен' = "CLASS_Version", если это имя метода. Если вы используете одно и то же имя метода при его объявлении, вам даже не нужно определять свойство «EntryPoint», это необходимо только в том случае, если вы переименовываете функцию из своего выбора или из-за нарушения имени в собственном коде, вы не хотите реплицировать управляемый код. – Pharap