Typeloadexceptionのヘルプ
-
13-10-2019 - |
質問
外部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など)の個別の名前に変更しましたが、問題を修正しました。選択された回答(「新しいソリューションへの転送」)は、プロジェクトの名前も再名前を付けていると思います。