2016-07-21 8 views
0

私は自分のプロジェクトでdllを参照しました。私のWPFアプリケーションを起動しても、同じフォルダにdllが存在しない場合、Visual Studioに未処理のXamlParseExceptionがあります。 リリースモードで実行すると、アプリがクラッシュするだけです。XamlParseExceptionが起動時に参照されたDLLが見つかりませんでした

以下のコードを使用して、アプリケーションの起動前にその例外を処理しようとしました。 残念ながら例外のメッセージが見つかりませんでしたDLLについては何も言いませんが、このメッセージを持っている:

Cannot create instance of 'MainWindow' defined in assembly 'App.Demo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Exception has been thrown by the target of an invocation. Error in markup file 'MainWindow.xaml' Line 1 Position 9. 

内部例外は、しかし、このコンテンツを持っている:

InnerException: System.Reflection.TargetInvocationException 
     Message=Exception has been thrown by the target of an invocation. 
     Source=mscorlib 
     StackTrace: 
      at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) 
      at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) 
      at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) 
      at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
      at System.Windows.Markup.BamlRecordReader.CreateInstanceFromType(Type type, Int16 typeId, Boolean throwOnFail) 
     InnerException: System.IO.FileNotFoundException 
      Message=Could not load file or assembly 'MyLibrary, Version=1.0.9999.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 
      Source=App.Demo 
      FileName=MyLibrary, Version=1.0.9999.0, Culture=neutral, PublicKeyToken=null 
      FusionLog==== Pre-bind state information === 

は、これらを処理する一般的なアプローチがあります参照されたライブラリが見つからない場合

public partial class App : Application 
    { 

     protected override void OnStartup(StartupEventArgs e) 
     { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException); 

     } 

     void UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      Exception ex = (Exception) e.ExceptionObject; 
      System.Windows.MessageBox.Show(ex.Message); 
      Application.Current.Shutdown(); 
     } 


    } 

いただきましたまた奇妙な:私はApplication.Current.Shutdownを呼び出しますが、例外は、自分のアプリケーションの同じクラッシュが得られた後、再びスローされます。

EDITは:

<Application x:Class="Demo.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

MainWindow.xaml::私は「

<Window x:Class="Demo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="My Application" Height="768" Width="1024" MaxWidth="1024" MinWidth="1024" MinHeight="768" MaxHeight="768" Background="#004B93"> 

答えて

0

MainWindow.xamlとApp.xaml

App.xamlのためのコードを追加しましたこれについてはわかりませんが、App.xamlとMainWindow.xamlを参照する必要があると思います何が間違っているかを知る。 DLLのリソースタイプを定義して、これらのいずれかに静的リソースを作成している可能性があります。 xamlパーサはアセンブリを検出せず、このオブジェクトのインスタンスを作成できません。 StartupUriとStartupを同時に使用していますか?

+0

をそれがすべてで助けて...だから私に教えてくれなかったので、私は、OK – tzippy

+0

XAMLファイルの両方を追加しましたリリースモードでのみクラッシュし、デバッグモードではクラッシュしませんか? Visual StudioのCTRL + F5キーからリリースモードを試しますか、いくつかのセットアップを作成してそこから起動しましたか?セットアップによってDLLがコピーされない可能性がありますか?私は他のレプリカと混乱しています... –

0

私は私のWPFアプリケーションを起動し、DLLが、あなたのアプリケーションからアクセスする必要のあるを参照してきたdllファイルと同じフォルダに

存在しない - デフォルトでは、それは同じになりますフォルダに移動します。それがDLLを見つけることができない場合、どのようにライブラリから使用するものを読み込むことができますか?

Visual Studioでは、参照用のプロパティの下で、 "ローカルコピー"がtrueに設定されていることを確認してください。その後、適切な対策を講じるには、ビルド - >クリーンソリューションを実行し、次にビルド - >ソリューションを再構築します。 MyLibrary.dllがリリースフォルダにあるはずです。例外を取得しないでください。

+0

"ローカルコピー"がtrueに設定されています。実際には、アプリケーションがデプロイされ、何らかの理由でDLLが存在しない場合のリリースケースを参照しています。ライブラリの機能を使用する前に、DLLが存在するかどうかを確認する必要があります。このケースは手作りでなければなりませんか? – tzippy

+0

アセンブリが不足しているかどうかはまだ分かりませんが、アプリケーションの予想される状態です。期待される可能性がある場合は、例外を渡すだけでなく、動的にアセンブリを読み込む必要があります。こちらをご覧ください:http://stackoverflow.com/questions/5198367/how-to-try-and-catch-assembly-not-foundまた、MEF – plast1k

+0

を参照してください。今AssemblyResolveイベントを調べています。ありがとう! – tzippy

0

問題は、XAMLパーサーが参照されたアセンブリへの参照を実際に引き起こさないため、構築時に参照アセンブリが削除されることです。ビルドチェーンは、未使用のアセンブリのコピーを防止するためにこれを行います(たとえば、デフォルトで参照されるSystem.Core)。コード内にアセンブリへの参照を追加するだけでよいのです。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7f255570-dd53-41f8-b8c4-a160ba325c90/reference-not-loaded-into-assembly-when-only-using-xaml-for-the-referenced-code-bug?forum=wpf

コード内の任意の参照は動作しますが、私はこの1つが好きです。あなたのアプリのAssemblyInfo.csで

using System; 

namespace MyReferencedAssembly 
{ 
    /// <summary> 
    /// Use to force an assembly reference 
    /// </summary> 
    /// <seealso cref="System.Attribute" /> 
    [AttributeUsage(AttributeTargets.Assembly)] 
    public class AssemblyReferenceAttribute : Attribute 
    { 
    } 
} 

、ちょうど参照属性を追加:

[assembly: MyReferencedAssembly.AssemblyReference] 
関連する問題