web-dev-qa-db-ja.com

ファイルまたはアセンブリを読み込めませんでした 'Xceed.Wpf.Toolkit

別のアプリケーション、Autodesk Revitのアドインを開発しています。これは、個別のDLLクラスライブラリとして構築されています。 Wpfツールキットプロパティグリッド)を使用しようとしています。 WPFウィンドウの1つで。プロパティグリッドはVisualStudioで正常に表示され、インテリセンスも機能します。ただし、アドインをロードした状態でRevitを起動しようとすると、次の例外が発生します。

System.Windows.Markup.XamlParseException occurred
  HResult=-2146233087
  Message=Could not load file or Assembly 'Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4' or one of its dependencies. The system cannot find the file specified.
  Source=PresentationFramework
  LineNumber=133
  LinePosition=27
  StackTrace:
       at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
  InnerException: System.IO.FileNotFoundException
       HResult=-2147024894
       Message=Could not load file or Assembly 'Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4' or one of its dependencies. The system cannot find the file specified.
       Source=mscorlib
       FileName=Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4
       FusionLog==== Pre-bind state information ===
LOG: User = GLOBAL\eric.anastas
LOG: DisplayName = Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4
 (Partial)
WRN: Partial binding information was supplied for an Assembly:
WRN: Assembly Name: Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4 | Domain ID: 1
WRN: A partial bind occurs when only part of the Assembly display name is provided.
WRN: This might result in the binder loading an incorrect Assembly.
WRN: It is recommended to provide a fully specified textual identity for the Assembly,
WRN: that consists of the simple name, version, culture, and public key token.
WRN: See whitepaper http://go.Microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue.
LOG: Appbase = file:///C:/Program Files/Autodesk/Revit 2014/
LOG: Initial PrivatePath = NULL
Calling Assembly : PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files\Autodesk\Revit 2014\Revit.exe.Config
LOG: Using Host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based Assembly bind).
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit.DLL.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.DLL.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit.DLL.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.DLL.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit.EXE.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.EXE.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit.EXE.
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.EXE.

       StackTrace:
            at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
            at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
            at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
            at System.Windows.Baml2006.Baml2006SchemaContext.ResolveAssembly(BamlAssembly bamlAssembly)
            at System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlTypeToType(BamlType bamlType)
            at System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlType(BamlType bamlType, Int16 typeId)
            at System.Windows.Baml2006.Baml2006SchemaContext.GetXamlType(Int16 typeId)
            at System.Windows.Baml2006.Baml2006Reader.Process_ElementStart()
            at System.Windows.Baml2006.Baml2006Reader.Process_OneBamlRecord()
            at System.Windows.Baml2006.Baml2006Reader.Process_BamlRecords()
            at System.Windows.Baml2006.Baml2006Reader.Read()
            at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
            at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
       InnerException: 

通常、Revitプラグインからサードパーティのアセンブリを参照する場合は、サードパーティのDLLがプラグインDLLと同じ場所にコピーされていることを確認します。チェックしてXceed.Wpf.Toolkit.dllがプラグインDLLを含むディレクトリにコピーされています。

エラーのログメッセージから、RevitプログラムディレクトリでDLL)を探していることに気付きました。このディレクトリにXceed.Wpf.Toolkit.dllをコピーした後、エラーは表示されなくなりました。

ただし、プラグインファイルが独自の分離フォルダーにあることに依存する既存のプラグイン展開ツールがあります。

では、プラグインを入手してWPFツールキットライブラリを見つける方法を誰かが知っていますか?

16
Eric Anastas

それで、私は2014年から私のこの質問に対する新しくてより良い解決策を見つけました。

今日、アセンブリからWPFコントロールをロードすると、XamlParseExceptionがスローされるという同じ問題が発生しました。ただし、今回は、作成したWPFコントロールライブラリアセンブリを使用していました。

DLLをEXEと同じフォルダに移動してみましたが、以前と同じように問題は解決しました。

いくつか検索した後、telerik.comフォーラムでこの質問を見つけました: http://www.telerik.com/forums/xamlparseexception-could-not-load-file-or-Assembly

x:Name属性を追加することにより、コントロールに名前を付けるだけで、コードビハインドにコントロールへの参照が追加され、何らかの理由でアセンブリの読み込みに関する問題が解決されます。

  <!--This causes a XamlParseException -->
  <mylib:MyCustomControl />

  <!-- This works -->
  <mylib:MyCustomControl x:Name="foobar"/>
18
Eric Anastas

私はこのアプローチのファンです。アセンブリをロードできないときにキャッチするAssemblyResolveイベントのイベントをAppDomainに登録できます。

次のようになります。

// using System.Reflection and System.IO

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args )
{
    if (args.Name.ToUpper().StartsWith("XCEED.WPF"))
    {
       string asmLocation = Assembly.GetExecutingAssembly().Location;

       string asmName = args.Name.Substring(0, args.Name.IndexOf(','));
       string filename = Path.Combine( asmLocation, asmName );

       if (File.Exists(filename)) return Assembly.LoadFrom(filename);
    }
}

あなたはそれをこれよりもう少し完全にすることができます、しかしあなたは考えを理解します...

9
Matt

これは非常に古い質問であることは知っていますが、少し前にこの正確なエラーに遭遇しました。 Visual Studioアプリケーションで2つのプロジェクト、または別のプロジェクトを参照するプロジェクトを使用している場合は、両方のプロジェクトに拡張ツールキットがインストールされていることを確認します。

両方のプロジェクトを右クリックし、[NuGetパッケージの管理]をクリックして、ダイアログの左側にある[インストール済みパッケージ]を参照します。両方のプロジェクトに拡張ツールキットが表示されない場合は、マネージャーを使用してオンラインで検索し、それらをインストールできます。

私の問題は、拡張ツールキットを両方ではなく1つのプロジェクトにのみインストールしたことでした。

うまくいけば、これは将来誰かを助けるでしょう。

7
John August

これはおそらく解決されていますが、一般的な理由は、Xceed.Wpf.Toolkitdllをエントリポイントプロジェクトに追加できないことです。おそらくそれをクラスライブラリプロジェクトの1つに追加し、その「ローカルコピー」属性をtrueに設定しました。このdllへの参照は、「ローカルコピー」属性がtrueに設定されたApp.xaml.csを含むメインプロジェクトにも追加する必要があります。

Visual Studio2013がこれを自動的に処理しないことに驚いています。

7
Klaus Nji

個人的には、受け入れられた回答(@Mattによる)に記載されているように実行する必要があると思いますが、AutodeskRevitインストールの「Program」フォルダにdllをコピーすることでもおそらくうまくいくと思います。私が正しく思い出せば、彼らはまた、あなたのアドインをこのフォルダのサブフォルダにデプロイして、それが正しく機能することを確認することを提案します。それはあなたが持っているような効果によるものだと思います。

1
Daren Thomas

Xceedアセンブリの「ブロックを解除」してください。ファイルを右クリックし、プロパティを選択してから[ブロックを解除]を選択します。 VSはエラーなしでコードをコンパイルしますが、実行しようとすると、Windowsはアセンブリをロードしません。鉱山は単一のアセンブリに統合されました。

0

の中に System.Reflection名前空間には、Assemblyクラスがあります。これを使用して、新しいアセンブリを現在のAppDomainにロードできます。

Assembly.LoadFrom("FileLocation");

これはまだ面倒ですが、メインディレクトリにないライブラリをロードする唯一の方法かもしれないと思います。

0
jamesthollowell

Visual StudioExtensionsでこの回避策を使用している人を見てきました。ただし、VSは、「ProvideCodeBaseAttribute」を使用して、より優れたソリューションを提供します。

https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.visualstudio.Shell.providecodebaseattribute

0
tom-englert

コントロールがXAMLから読み込まれる場合、Xceed.Wpf.Toolkit.dllが読み込まれる呼び出し元のアセンブリはPresentationFramework.dllです。したがって、この場合、CLRはアドインフォルダーを調べません(呼び出し元のアセンブリのフォルダーを調べるため、アドインのメインアセンブリから別のクラスが読み込まれたときに何が行われるか)。

したがって、見つけたとおりに、コードビハインドにコントロールへの参照を配置するか、AppDomain.CurrentDomain.AssemblyResolveを使用してCLRにアドインフォルダーを検索させることができます。

DllをRevitインストールフォルダに配置することは機能しますが、別のアドインインストールによって上書きされ、測定が困難な結果になる可能性があるため、私の観点では悪い習慣です。

0
Maxence

Fody Costura を使用して、コンパイルされたXceed.Wpf.Toolkit.dll.dllを埋め込みました。 NuGetを使用してインストールし、Install-CleanReferencesTargetPacket Manager Consoleに入力するだけです。

0
Markus Weber