Как я останавливаю искажение имени экспортируемой функции своего DLL?

Что JSON не является массивом Foo JSON. Код JsonConvert.DeserializeObject(jsonString) будет разбирать строку JSON от корня вверх, а ваш тип T должен точно соответствовать этой структуре JSON. Синтаксический анализатор не собирается гадать , член JSON должен представлять List, который вы ищете.

Вам нужен корневой объект, представляющий JSON из корневой элемент.

Вы можете легко позволить классам делать это, создаваемое из образца JSON. Для этого скопируйте свой JSON и нажмите Edit -> Paste Special -> Paste JSON As Classes в Visual Studio.

В качестве альтернативы вы можете сделать то же самое на http://json2csharp.com , который генерирует больше или меньше тех же классов.

Вы увидите, что коллекция фактически является одним элементом глубже, чем ожидалось:

public class Foo
{
    public string bar { get; set; }
}

public class RootObject
{
    public List foo { get; set; }
}

Теперь вы можете десериализовать JSON из корня (и быть уверенным переименовать RootObject в нечто полезное):

var rootObject = JsonConvert.DeserializeObject(jsonString);

И получить доступ к коллекции:

foreach (var foo in rootObject.foo)
{
    // foo is a `Foo`

}

Вы всегда можете переименовать свойства, чтобы следовать за своим соглашением об обсадке, и применить JsonProperty:

public class Foo
{
    [JsonProperty("bar")]
    public string Bar { get; set; }
}

Также убедитесь, что JSON содержит достаточно данных образца. Парсер класса должен угадать соответствующий тип C # на основе содержимого, содержащегося в JSON.

29
задан Slapout 23 September 2009 в 16:26
поделиться

3 ответа

Небольшая поправка - для успешного разрешения имени по клинету

extern "C"

должно быть таким же, как при экспорте, так и при импорте.

extern «C» сократит имя процедуры до: «_GetName».

Более того, вы можете указать любое имя с помощью раздела EXPORTS в файле .def

24
ответ дан 28 November 2019 в 00:09
поделиться

правильный ответ следующий:

extern "C" int MyFunc(int param);

и

int MyFunc(int param);

- это два объявления, в которых используются разные внутренние имена, первое - в стиле C, второе - в Стиль С ++.

внутреннее именование, необходимое для инструментов сборки, чтобы определить, какие аргументы получает функция, какой тип возвращает и т. Д., Поскольку C ++ более сложный (упс, перегруженные, виртуальные функции и т. Д.) - он использует более сложное именование. Соглашение о вызовах также влияет на именование c и c ++.

оба эти стиля именования применяются при одинаковом использовании __declspec (dllexport).

Если вы хотите пропустить искажение имени экспортируемой подпрограммы, добавьте файл определения модуля в свой проект, введите его (в этом случае вам не требуется declspec dllexport):

LIBRARY mylib
EXPORTS
  MyFunc

это пропустит явное оформление имени (примеры ниже).

_MyFunc (c style, __cdecl)
_MyFunc@4 (c style, __stdcall)
?MyFunc@@YAHH@Z (c++ style, __cdecl)
?MyFunc@@YGHH@Z (c++ style, __stdcall)
6
ответ дан sn0w 14 October 2019 в 08:39
поделиться

Это нормально для экспорта DLL с соглашением __ stdcall . @N указывает количество байтов, которые функция принимает в свои аргументы - в вашем случае ноль.

Обратите внимание, что страница MSDN при экспорте из DLL специально говорит «использовать соглашение о вызовах __stdcall» при использовании «ключевого слова __declspec (dllexport) в определении функции».

9
ответ дан 28 November 2019 в 00:09
поделиться