C#コード
次のC#コードを「MinimalFormsApp.dll」というライブラリにコンパイルしています。
using System;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsTest
{
public static class CreateACoolWindow
{
public static void Main(string[] args)
{
CreateWindow();
}
public static void CreateWindow()
{
Thread winFormsThread = new Thread(new ThreadStart(StartFormApplication));
winFormsThread.SetApartmentState(ApartmentState.STA);
winFormsThread.Start();
Console.WriteLine("Started thread");
}
private static void StartFormApplication()
{
Application.EnableVisualStyles();
Console.WriteLine("EnableVisualStyles");
Application.SetCompatibleTextRenderingDefault(false);
Console.WriteLine("SetCompatibleTextRenderingDefault");
FormSubClass dmw = new FormSubClass();
Console.WriteLine("Created window object");
Application.Run(dmw);
}
}
public class FormSubClass : Form
{
public FormSubClass()
{
Console.WriteLine("FormSubClass Constructor called");
InitializeComponent();
}
private void InitializeComponent()
{
Console.WriteLine("Starting component init......");
this.SuspendLayout();
this.AutoScaleDimensions = new SizeF(6F, 13F);
this.AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new Size(300, 500);
this.Name = "FormSubClass";
this.Text = "FormSubClass";
this.ResumeLayout(false);
this.PerformLayout();
}
}
}
Pythonコード
Pythonfor.NETとPython2.7for x86の使用このC#ライブラリからCreateWindow()メソッドを呼び出そうとしています。
私のPythonコードは次のとおりです。
import clr
clr.AddReference("MinimalFormsApp")
from WindowsFormsTest import CreateACoolWindow
CreateACoolWindow.CreateWindow()
#Print some output
print "Mary had a little lamb,"
print "it's fleece was white as snow;"
print "and everywhere that Mary went",
print "her lamb was sure to go."
コンソール出力
これはPythonがコンソールで出力するものです
スレッドを開始
しましたメアリーは小さな子羊を持っていました、EnableVisualStyles
SetCompatibleTextRenderingDefaultフリースは雪のように白かった。
そしてメアリーが行ったところはどこでも彼女の子羊は必ず行った。
と呼ばれるFormSubClassコンストラクタ
ご覧のとおり、「Starting component init ......」は出力されず、「Created window object」も出力されず、実際にウィンドウは作成されません。Pythonプログラムは終了し、ウィンドウが作成されなかった理由を示すエラーメッセージは生成されません。
別のC#プログラムから同じC#ライブラリを呼び出すと、すべてが期待どおりに印刷され、ウィンドウが作成されます。
Python for .NETがFormsコンストラクターでサイレントに失敗する理由を誰かが知っていますか?