0

から継承するクラスを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」が追加情報とともに表示されることに気付きました。欠落しているメンバーにアクセスしようとしました。これにより、最終的にスクリーンショットのメッセージが表示されます(続行を押します)。どのメソッドが欠落しているのかを知っていれば...

4

1 に答える 1

3

DLLの古いコピーを見つけています。ツールボックスフォルダに古いコピーがある可能性があります。ツールボックスから削除して、再度追加してください。たぶん、GACには古いコピーがありますが、実行時に問題なく動作する場合はほとんどありません。

見つからない場合は、VisualStudioのコマンドプロンプトからFuslogvw.exeを実行します。すべてのバインディングをログに記録して、CLRがアセンブリを取得した場所を確認できるようにします。

于 2012-09-06T17:33:06.793 に答える