2

私が聞きたい質問をする前に、私の問題を紹介させてください。

私の会社は、ASP.NET MVC で開発している Web サイトに取り組んでいます。ページの 1 つは有向グラフを示すイメージを表示する必要があります (グラフはMicrosoft.Gleeグラフ ライブラリを使用して作成されます)。グラフを作成するメソッドは次のとおりです。

private bool CreateGraph(XDocument document, string graphPath)
{
        try
        {
            if (document.Descendants("Nodes").Count() == 0)
                return false;

            Microsoft.Glee.Drawing.Graph graph = new Microsoft.Glee.Drawing.Graph("graph");

            string id, parent;
            foreach (var node in document.Descendants("Nodes"))
            {
                id = node.Attribute("Id").Value;
                parent = node.Attribute("Parent").Value;

                Microsoft.Glee.Drawing.Edge edge = graph.AddEdge(parent, id);

                edge.TargetNode.Attr.Shape = Microsoft.Glee.Drawing.Shape.Circle;
                edge.SourceNode.Attr.Shape = Microsoft.Glee.Drawing.Shape.Circle;
            }

            Microsoft.Glee.GraphViewerGdi.GraphRenderer renderer = new Microsoft.Glee.GraphViewerGdi.GraphRenderer(graph);
            renderer.CalculateLayout();
            Bitmap bitmap = new Bitmap((int)graph.Width, (int)graph.Height, PixelFormat.Format32bppPArgb);
            renderer.Render(bitmap);
            bitmap.Save(graphPath);

            return true;
        }
        catch
        {
            throw;
        }
}

私はこのコードの最初の作成者ではありません。つまり、このコードは社内の別のプログラマーによって作成されたものなので、コードで行われた決定を正当化することはできません。

とにかく、私が抱えている問題は次のとおりです。ページをローカルでテストすると、画像が正常に作成され、ページに表示されます。ただし、Web サイトをデプロイすると (ホスティングに Windows Azure を使用しています)、次の例外が発生します。


    The type initializer for 'Microsoft.Glee.GraphViewerGdi.GViewer' threw an exception.
    System.TypeInitializationException: The type initializer for 'Microsoft.Glee.GraphViewerGdi.GViewer' threw an exception. --->
    System.ComponentModel.Win32Exception: Error creating window handle.
      at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
      at System.Windows.Forms.Control.CreateHandle()
      at System.Windows.Forms.Form.CreateHandle()
      at System.Windows.Forms.Control.get_Handle()
      at System.Windows.Forms.Control.CreateGraphicsInternal()
      at System.Windows.Forms.Control.CreateGraphics()
      at Microsoft.Glee.GraphViewerGdi.GViewer.GetDotsPerInch()
      at Microsoft.Glee.GraphViewerGdi.GViewer..cctor()
      --- End of inner exception stack trace ---
      at Microsoft.Glee.GraphViewerGdi.GViewer..ctor()
      at Microsoft.Glee.GraphViewerGdi.GraphRenderer.CalculateLayout()

これは何らかのメモリの問題だと思いますが、それについてどう思いますか、何が問題の原因である可能性があるか教えていただけますか? Web を検索してもあまり役に立ちませんでした。

前もって感謝します。

4

1 に答える 1

0

いいえ、これはメモリの問題ではありません。問題は、Gleeライブラリがそのジョブを実行するためにウィンドウハンドルを必要としているように見えることです。サーバーにログインしていて、ハンドルを生成するためのウィンドウターミナルが開いているため、ローカルでデバッグする場合は正常に機能します。

ただし、サーバーで実行している場合は、ネットワークサービスなどのユーザー、またはウィンドウターミナルにログインしていない特定のユーザーに関連付けられている可能性が高いため、ウィンドウを作成するためのデスクトップが関連付けられていません。

コードを実行しているサーバーの信頼性が中程度であり、ウィンドウハンドルの作成が許可されていない可能性があります。Azureについては、これが当てはまるかどうかを知るのに十分な知識がありません。

編集:

Azureで完全な信頼を有効にする必要があるようです

http://blogs.msdn.com/b/windowsazure/archive/2009/03/18/hosting-roles-under-net-full-trust.aspx

サービス定義ファイルに、以下を追加する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="MyService" 
   xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
   <WebRole name="WebRole" enableNativeCodeExecution="true">
    <InputEndpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
    </InputEndpoints>
  </WebRole>
</ServiceDefinition>
于 2012-10-02T16:46:43.490 に答える