2016-01-29 4 views
1

Попытка сделать некоторые основные вызовы gdi32.dll функций из C# после публикации Azure Web App, и у меня много проблем. Является ли он полностью поддерживаемым или есть изменение обходного пути/конфигурации, которое я могу сделать?Выполнение вызовов функций gdi32.dll в Azure Web App - поддерживается?

Указатели ниже всех возвращают ненулевые значения при запуске в Visual Studio при стандартной настройке, но при запуске в Azure они возвращают 0.

Создано Web Forms проект основной ASP.NET и добавил удар в коде от Default.aspx для теста:

[DllImport("gdi32.dll")] 
private static extern IntPtr CreatePen(int enPenStyle, int nWidth, uint crColor); 

[DllImport("gdi32.dll")] 
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); 

[DllImport("gdi32.dll")] 
private static extern bool MoveToEx(IntPtr hdc, int X, int Y, IntPtr lpPoint); 

[DllImport("gdi32.dll")] 
private static extern bool LineTo(IntPtr hdc, int nXEnd, int nYEnd); 

[DllImport("gdi32.dll")] 
private static extern bool DeleteObject([In] IntPtr hObject); 


protected void Page_Load(object sender, EventArgs e) 
{ 
    using (Bitmap bitmap = new Bitmap(100, 100)) 
    { 
     using (Graphics graphics = Graphics.FromImage(bitmap)) 
     { 
      IntPtr hdc = graphics.GetHdc(); 
      IntPtr pen = CreatePen(0, (int)2, (uint)0); 
      IntPtr hObject = SelectObject(hdc, pen); 

      DeleteObject(hObject); 
      DeleteObject(pen); 
      graphics.ReleaseHdc(); 

      Response.Write(string.Format("HDC handle: {0}", hdc)); 
      Response.Write("<br/>"); 
      Response.Write(string.Format("CreatePen pen: {0}", hObject)); 
      Response.Write("<br/>"); 
      Response.Write(string.Format("SelectObject returned: {0}", hObject)); 
     } 
    } 
}  

ответ

5

Большинство GDI звонки явно блокируются песочнице Azure App службы, поэтому ошибочное поведение, Ожидается. К сожалению, обходных путей нет.

Вы можете найти более подробную информацию о песочнице и обоснование этого ограничения здесь: https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox

Ради радикального уменьшения площади поверхности атаки, песочница предотвращает почти все API, Win32k.sys от того, , что фактически означает, что большинство системных вызовов User32/GDI32 блокируются. Для большинства приложений это не проблема, так как большинство приложений Azure Web Apps не требуют доступа к функциональности пользовательского интерфейса Windows (они все-таки являются веб-приложениями).

Некоторые исключения сделаны для обеспечения возможности использования популярных библиотек генерации PDF. См. Ссылку выше для получения более подробной информации.