Я P/вызываю Graphviz как показано здесь. Когда я написал эту запись в блоге, код работал просто отлично. Теперь я собираю HttpModule, который отображает графики Graphviz с использованием этого кода, но я получаю AccessViolationException на agmemread.
// Native signature
Agraph_t agmemread(char *);
// P/Invoke Signature
[DllImport(LIB_GRAPH)]
private static extern IntPtr agmemread(string data);
// Usage
IntPtr g = agmemread(data);
Как я уже сказал, раньше это работало отлично. Но теперь я не могу заставить свой код работать ни в чем. Даже мои старые приложения Graphviz, основанные на том же коде, больше не работают.
Что я мог изменить, что могло вызвать это? Я даже не скачивал новую версию Graphviz или что-то в этом роде, так что все библиотеки DLL одинаковы.
EDIT: я попытался изменить string на StringBuilder, но это дало тот же результат. Затем я добавил атрибут MarshalAs:
static extern IntPtr agmemread([MarshalAs(UnmanagedType.LPWStr)] string data);
При этом я больше не получаю AccessViolationException, но Graphviz не может правильно прочитать строку и возвращает нулевой указатель.
agmemread— это встроенная функция, поэтому я понятия не имею, что она делает под капотом, чтобы вызвать нарушение прав доступа. - person David Brown   schedule 30.01.2010LPStrтоже не работает. Я пробовалStringBuilder, потому что параметр -char *, но это ничего не дало.LPWStr- единственное, что хотя бы близко к рабочему состоянию. - person David Brown   schedule 30.01.2010