Безопасно используйте SuppressUnmanagedCodeSecurity - PullRequest
9 голосов
/ 09 июля 2011

В настоящее время я создаю управляемую оболочку для неуправляемой библиотеки DLL.Дело в том, что оболочка выполняет ТОЛЬКО вызовов из неуправляемой библиотеки DLL, но сама экспортирует очень мало методов.Из исследований, которые я сделал, это должно быть безопасно, но я хочу убедиться, что я правильно понял.По сути, это то, как я это делаю.

[SuppressUnmanagedCodeSecurity()]
internal static class SomeAPI
{
    [DllImport("base.dll"]
    internal static extern bool Somefunc();
    [...] Other internal DllImports
}

public class Wrapper : IDisposable
{
    [SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
    public Wrapper()
    {
        SomeAPI.SomeFunc();
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    [SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
    protected override void Dispose(bool disposeManagedResources)
    {
        SomeAPI.SomeFunc();
    }
}

Каждый добавляемый мной защищенный или общедоступный метод должен иметь атрибут [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)].И я имею в виду каждый, чтобы избежать случайного пути кода, который приводит к вызову SomeAPI.

Теперь любой метод, добавленный в Wrapper, внутренний или закрытый, является "безопасным".Это предположение верно?

Извините, если мне было неясно.Я пишу обертку, чтобы она не переформатировала жесткий диск или что-то в этом роде.Оболочка будет выставлена ​​в своем собственном управляемом dll (наряду с другими вещами).Поскольку один вызов оболочки может привести к сотням обращений к неуправляемой dll, я не хочу, чтобы служебная нагрузка CLR проверяла все эти вызовы - таким образом использование SuppressUnmanagedCodeSecurity.В документах упоминается «Используйте этот атрибут с особой осторожностью. Неправильное использование может создать слабые места безопасности». И вот, что я спрашиваю, я снова «в безопасности» с вышеуказанной методологией.

...