から継承するクラスをC++/CLIで作成しましたSystem.Windows.Forms.UserControl
。正常に動作しますが、このコントロールを含むフォームをデザイナービューで表示しようとすると、次のエラーでクラッシュします。
[コードに移動]をクリックすると、コントロールのインスタンスがフォームに追加されMainForm.Designer.cs
た行のに送信されます。mConsole
宣言されていないと言われていますが、それは数行下で行われます。BeginInit
はnew'ingmConsole
の後に呼び出される最初の関数であるため、Init
すべてのプロパティを設定する前に呼び出されました。この目的ですべてが正しく見えます。
コントロールのdllは/clr
スイッチを使用して構築され、それを使用するWindowsフォームプロジェクトには参照セットがあります。毎回完全に構築および実行されます。唯一の問題はデザインビューです。コンポーネントを追加する必要があるたびに、デザイナーファイルを手動で編集する必要があります。これは非常に面倒です。
これが私のコントロールのコードの一部です:
//Console.h
namespace MConsole {
public ref class MCConsole : public System::Windows::Forms::UserControl,
public System::ComponentModel::ISupportInitialize {
public:
MCConsole();
virtual ~MCConsole();
!MCConsole();
//Skipping custom properties and methods...
virtual void BeginInit();
virtual void EndInit();
protected:
virtual void OnPaint( System::Windows::Forms::PaintEventArgs ^ pe ) override;
};
//Console.cpp
#include "Console.h"
void MCConsole::Init(){
if( m_bInitialized )
return;
// Initialize native instance
m_pNativeInstance->Init( (HWND)this->Handle.ToPointer() );
m_bInitialized = true;
// Initialize timer
m_TimerTickHandler = gcnew System::EventHandler( this, &MCConsole::Render );
m_Timer.Tick += m_TimerTickHandler;
m_Timer.Interval = Math::Round<float, int>(1000.0f/FRAMES_PER_SECOND);
m_Timer.Start();
// Initialize event handlers
m_MouseWheelHandler = gcnew System::Windows::Forms::MouseEventHandler( this, &MCConsole::MouseWheelHandlerZoom );
this->MouseWheel += m_MouseWheelHandler;
m_ResizeHandler = gcnew System::EventHandler( this, &MCConsole::Resize );
this->SizeChanged += m_ResizeHandler;
m_MouseDownHandler = gcnew System::Windows::Forms::MouseEventHandler( this, &MCConsole::MouseDownHandler );
this->MouseDown += m_MouseDownHandler;
m_MouseLeaveHandler = gcnew System::EventHandler( this, &MCConsole::MouseLeaveHandler );
this->MouseLeave += m_MouseLeaveHandler;
m_MouseMoveHandler = gcnew System::Windows::Forms::MouseEventHandler( this, &MCConsole::MouseMoveHandler );
this->MouseMove += m_MouseMoveHandler;
m_MouseUpHandler = gcnew System::Windows::Forms::MouseEventHandler( this, &MCConsole::MouseUpHandler );
this->MouseUp += m_MouseUpHandler;
m_KeyPressHandler = gcnew System::Windows::Forms::KeyPressEventHandler( this, &MCConsole::KeyPressHandler );
this->KeyPress += m_KeyPressHandler;
m_DropHandler = gcnew System::Windows::Forms::DragEventHandler( this, &MCConsole::DropHandler );
this->DragDrop += m_DropHandler;
m_VisibleChangedHandler = gcnew System::EventHandler( this, &MCConsole::VisibleChangedHandler );
this->VisibleChanged += m_VisibleChangedHandler;
// Initialize layout wrapper
m_hRegionLayout = gcnew MCLayout( *m_pNativeInstance->getRegionLayout() );
m_bInitialized = true;
}
void MCConsole::BeginInit(){
Init();
}
void MCConsole::EndInit(){}
void MCConsole::OnPaint( System::Windows::Forms::PaintEventArgs ^ pe ) {
System::Windows::Forms::UserControl::OnPaint( pe );
if( m_bInitialized )
m_pNativeInstance->Refresh();
}
何が欠けているか、めちゃくちゃですか?または、Designerのクラッシュをデバッグするにはどうすればよいですか?
更新:Visual Studioの別のインスタンスを起動し、他のVSのプロセスに接続しようとしました。前者をすべての種類の例外で中断するように構成しましたが、デザインビューを開くと、「System.MissingMethodException」が追加情報とともに表示されることに気付きました。欠落しているメンバーにアクセスしようとしました。これにより、最終的にスクリーンショットのメッセージが表示されます(続行を押します)。どのメソッドが欠落しているのかを知っていれば...