2010-12-27 16 views
3

私は外部DLLのクラスを使用する.NET 3.5アプリケーション(WinForms)を作成していますが、アプリケーションが起動しようとするたびにSystem.TypeLoadExceptionを受信し続けます。ここ
が表示さVS例外です:TypeLoadExceptionに関するヘルプ

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()に停止していることである。ここでは

 
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: 

は、私が実行しているコードがありますInitialize機能に入ることさえできます。

ただし、Initialize関数で外部DLLへのすべての参照をコメントアウトすると、アプリケーションが正しく初期化されます。


周りに読んだ後、私は(x64のDLLは、x86のアプリケーションから参照されているように)自分のプロジェクトに基づいています。このエラーを報告する人の数が異なる使用していたことに気づきました。したがって、私はDLLとアプリケーションが両方のx86でしたが、私はまだTypeLoadExceptionを持っているようにビルド設定を変更しました。

紛失しているものはありますか?

+0

私はアプリケーションのマニフェストで間違ったdllの名前を持っていたときにこのエラーが発生しました。 – ZX9

答えて

2

1つNutzyもsimilar problemを持っていたし、彼は新しいプロジェクトにすべてのクラス、フォームとコントロールをコピーして、それを解決した表示されます。私も同様に問題は解決しました。

ご協力いただきありがとうございます、ジム・ミッシェルとポール・アレクサンダー。問題を解決するためにあなたの努力を表明しました。

+0

私も同様の問題がありました。それに対処しながら、何らかの理由で「C:\ SomeDll \ SomeDll.dll」というファイルを削除できないという警告が表示されていました。パス "C:\ SomeDll \ SomeDll.dll"へのアクセスは拒否されました。だからVisual Studioをシャットダウンし、エラーをスローしていた.dllと.pdbを削除し(VSを開いたままで削除できないため)、Visual Studioを再起動しました。その後問題は解決しました。 – edhubbell

1

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

また、値がロードされた後にDebugステートメント(System.Diagnosticsを参照)を使用して、失敗した場所を特定できます。

+0

私が質問に示したように、デバッガは 'Initialize'メソッドに入っていないので、何がエラーの原因になっているかを見る方法がありません。プログラムは* any設定をロードするチャンスを得られません。 –

+1

@Alex:そうです。申し訳ありません。ポール・アレキサンダーがあなたを正しい方向に向けています。 –

4

依存アセンブリが正しく読み込まれない理由を詳しく知るには、InnerExceptionプロパティとLoadExceptionプロパティを調べる必要があります。

の前にの前に例外がスローされる理由は、メソッドがJITコンパイルされる方法に起因します。メソッドが最初に実行されると、CLRはそのメソッドのすべてのMSIL命令を検証し、ランタイムに相当するものにコンパイルします。 PolyMorph.Common.Settings型はInitializeメソッドで使用されるため、CLRはコンパイル時に解決しようとします。ロードが失敗するため、Initializeは決して実行されません。

独自のコードで例外をキャプチャするには、Initializeコード全体を別のメソッドに移動し、そのメソッドをInitializeのtry ... catchブロックで呼び出します。

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

あなたが与えたコードを試しましたが、私はまだ例外を取得します。例外には、InnerExceptionのデータがありません。私は奇妙な発見をしています。例外の原因を追跡することはできません。 –

+0

@Alex:例外は、おそらく 'PolyMorph.Common.Settings'クラスのSharedコンストラクタ、またはShared(静的)初期化子のいずれかにあります。 –

+0

@Alex:ex.ToString()への呼び出しの全結果を送信します。それはもう少し洞察力を提供するのに役立ちます。 –

1

私は同じ問題があり、VisualStudioやJITコンパイラのバグだと確信しています。私はテストプロジェクトでカスタムリファレンスがないので、DLLやx64とx86とは関係がないことを知っています。私は違反行をstructのメンバ変数にトラッキングしました。その特定のメンバー変数について興味深いものはありませんでした(単純なクラスでした)。

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

これはメンバーでした。 #ifが真であれば動作します。私はそれが#falseするように変更した場合、それはエラーなしでコンパイルが、私は、クラス全体では全く何にアクセスしたときに、その後、実行時に、それは私にTypeLoadException

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public struct config { 
... 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXUARTPORT)] 
     public uartparam_t[] uartparam; //(size 1792) 
... 
    } 
の一部であった
[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 

    .... 

を与えます

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

0

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

0

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

Application.exeとApplication.dll

それぞれをプロジェクトプロパティ(Application.exeとLibrary.dllなど)で別の名前に変更し、問題を修正しました。私は選択された答え( "新しいソリューションに移す")を彼らがプロジェクトの名前を変更していると思います。

関連する問題