Это зависит от того, является ли неуправляемый компонент, который вы вызываете, запрограммированным потокобезопасным или нет.
Если вы получаете нарушения доступа только при параллельном вызове этого кода, похоже, что используемый вами компонент не является поточно-ориентированным.
Используйте оператор C # lock()
, чтобы сделать его безопасным:
private static readonly myLockObject = new object();
...
lock (myLockObject)
{
CallMyUnsafeCode();
}