質問

外部DLLからクラスを使用する.NET 3.5アプリケーション(WinForms)を書いています。 System.TypeLoadException アプリケーションが開始しようとするたびに。
以下は、例外とディスプレイです。

System.TypeLoadException was unhandled
  Message=Could not load type 'PolyMorph.Common.Settings' from assembly 'PolyMorph, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
  Source=PolyMorph
  TypeName=PolyMorph.Common.Settings
  StackTrace:
       at PolyMorphApp.App.Initialize()
       at PolyMorphApp.App.Main()
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

これが私が実行しているコードです:

Friend NotInheritable Class App

    <STAThread()> Shared Sub Main()
        'set the exception handlers'
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
        AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
        'initialize the application'
        App.Initialize()

        'and then run the application'
        Dim mainForm As New PolymorphHost
        Application.Run(mainForm)
    End Sub

    Shared Function Initialize() As FunctionResult
        If App.InitializeDataDirectory() = False Then
            Return New FunctionResult(False, "the application's data directory")
        End If


        _settings = New PolyMorph.Common.Settings(AppDataDirectory & "\Settings.dat")
        ......code continues to load settings from the _settings variable
    End Function
End Class



私を驚かせるのは、VS2010デバッガーがラインで停止することです App.Initialize() に足を踏み入れることなく Initialize 働き。

ただし、外部DLLへのすべての参照をコメントした場合 Initialize 機能、アプリケーションは適切に初期化されます。


読んだ後、このエラーを報告している多くの人々がプロジェクトに異なるビルドを使用していることに気付きました(X64 DLLのように、X86アプリケーションから参照されています)。したがって、ビルド構成を変更したので、DLLとアプリケーションは両方ともx86でしたが、まだあります TypeLoadException.

私が足りないものはありますか?

役に立ちましたか?

解決 2

一つのナティも持っていたようです 同様の問題 そして、彼はすべてのクラス、フォーム、コントロールを新しいプロジェクトにコピーすることでそれを解決しました。私も同様に行い、問題は解決しました。

ありがとう、ジム・ミシェルとポール・アレクサンダーはあなたの援助をしてくれてありがとう。問題を解決するのを手伝うための努力に投票しました。

他のヒント

InnerexceptionとLoadexceptionのプロパティを調べて、従属アセンブリが適切にロードされていない理由についてより良い詳細を取得する必要があります。

それが例外を投げかけている理由 初期化は、メソッドのJITコンパイルの方法によるものです。メソッドが初めて実行されると、CLRはそのメソッドのすべてのMSIL命令を検証および解決してから、ランタイム同等物にコンパイルします。 Polymorph.common.settingsタイプは初期化方法で使用されるため、CLRはコンパイル時に解決しようとします。負荷が失敗するため、初期化は実行されません。

独自のコードで例外をキャプチャするには、初期化コード全体を別のメソッドに移動するだけで、そのメソッドを試してみてください...初期化からブロックをキャッチします。

Try
    InitializeInternal()
Catch ex As TypeLoadException
    System.Diagnostics.Debugger.WriteLine(ex.ToString())
End Try

最も可能性の高い原因は、設定のいずれかをロードしようとするときに例外をスローしていることです。の最初のステートメントでブレークポイントを設定してみてください Initialize 方法。それか そうかもしれない シングルステップの機会を与えて、エラーがどこにあるかを確認してください。

または使用することができます Debug ステートメント(参照 System.Diagnostics)各値がロードされた後、故障している場所を決定します。

私は同じ問題を抱えており、VisualStudioまたはJITコンパイラのバグだと確信しています。テストプロジェクトにカスタム参照がなかったため、DLLまたはX64対X86とは何の関係もないことは知っています。問題の行を構造のメンバー変数まで追跡しました。その特定のメンバー変数について興味深いものは何もありませんでした(それは単純なクラスでした:)

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct Foo
    {
        int x;
    }

そして、それは次のようにメンバーでした。 #IFが真実であれば機能します。 #falseに変更すると、エラーなしでコンパイルされますが、実行時にクラス全体で何かにアクセスすると、TypeLoadexceptionが表示されます。

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct uartparam_t
    { //size 112
        public UInt16 portnum; //0
        public Byte conntype;
        public Byte baud;
        public Byte databits;
        public Byte stopbits;
        public Byte parity;
        public Byte flowctrl;
#if true
        public int remoteip;
#else
        public Foo remoteip; //8 -- for some reason this is making the program crash! ?!?!?
#endif

     ....

の一部でした

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct config {
 ...
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXUARTPORT)]
        public uartparam_t[] uartparam; //(size 1792)
 ...
    }

意味がありません。私はアプリケーションの完全な再構築を試み、新しいソリューションで新しいプロジェクトを作成しましたが、それはどれも役に立ちませんでした。それを動作させる唯一の方法は、構造体をINTに変更し、intからstructの外側のfooへの型変換に対処することでした。

製品にコードを追加しているときに、このエラーが発生することがよくあります。私たちが遭遇する問題は、製品の最新バージョンがGACにインストールされており、開発者マシンで新しい機能をテストしようとしていることです。私が実行するアプリは、ローカルで構築される新しい機能に依存しますが、アプリはGAC Wichからアセンブリをロードしても新しい機能は含まれていません。製品をアンインストールすると、例外はなくなります。

私の問題は親のアセンブリであり、DLLには同じアセンブリ名がありました。

例:application.exeおよびapplication.dll

それぞれをプロジェクトプロパティ(Application.exeおよびlibrary.dllなど)の個別の名前に変更しましたが、問題を修正しました。選択された回答(「新しいソリューションへの転送」)は、プロジェクトの名前も再名前を付けていると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top