WPF

【WPF】他プロジェクトのカスタムコントロール参照時に『XLS0418 アセンブリ’ ‘が見つかりませんでした。アセンブリ参照が欠けていないか、また、プロジェクトとすべての参照アセンブリがビルドされているかどうかを確認してください』が出た場合の確認

アプリケーション開発では、複数のアプリケーションで使える共通ライブラリを別に作成し、個々のアプリケーションから参照するということが良くあります。

今回ライブラリ内のカスタムコントロールを参照しようとしたところ引っかかってしまったので、この時の原因と対応をメモします。(暫くすると確実にまた引っかかるので。そういえば以前も引っ掛かりました)

発生したエラーはこちら

XLS0418 アセンブリ ‘ ‘ が見つかりませんでした。アセンブリ参照が欠けていないか、また、プロジェクトとすべての参照アセンブリがビルドされているかどうかを確認してください。

プロジェクトの参照もしているし、ビルドも行われている・・・なぜだ!という方、参考になるかもしれません。今回は思い込みで気づきませんでした。

対応(結論)

このエラーは、参照しているdllファイルが存在しない場合に発生します。

ウィンドウのxamlに記載しているnamespace参照定義にて、assemby句に定義しているアセンブリ名のdllが実際に存在するかどうか確認してください。

筆者は誤ったアセンブリ名を記載していました。

<Window x:Class="Test.Dialogs.hogeWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test.Dialogs"
 これ⇒ xmlns:ctrls="clr-namespace:WpfLibrary.UI.Controls;assembly=WpfLibrary.UI.Controls"
        mc:Ignorable="d"
        Title="hogeWindow" Height="450" Width="800">
対応

assembly句以降の名前を実際に生成されるdll名に修正してください。

xmlns:ctrls="clr-namespace:WpfLibrary.UI.Controls;assembly=ここを実際に生成されるdll名に直すとエラーが消えます ※拡張子(.dll)は不要"

原因

今回のプロジェクトでは以下のプロジェクト構造にしていました。

CustomControl1は名前空間「WpfLibrary.UI.Control」ですが、dllはWpfLibrary.dllに集約して生成する設定としていました。WpfLibrary.UI.Controls.dllというdllは存在しないためビルドが通っていませんでした。

ではなぜ誤ったアセンブリ名を指定したのか

WpfLibraryのUI/Controlsフォルダ内にカスタムコントロールを定義した際、ソースコード上に自動生成される『異なるプロジェクトに存在する XAML ファイルでこのカスタム コントロールを使用する場合』の説明で以下の記載があります。

手順 1b) 異なるプロジェクトに存在する XAML ファイルでこのカスタム コントロールを使用する場合
この XmlNamespace 属性を使用場所であるマークアップ ファイルのルート要素に追加します:

xmlns:MyNamespace=”clr-namespace:WpfLibrary.UI.Controls;assembly=WpfLibrary.UI.Controls

また、XAML ファイルのあるプロジェクトからこのプロジェクトへのプロジェクト参照を追加し、
リビルドして、コンパイル エラーを防ぐ必要があります:

ソリューション エクスプローラーで対象のプロジェクトを右クリックし、
[参照の追加] の [プロジェクト] を選択してから、このプロジェクトを参照し、選択します。

手順 2)
コントロールを XAML ファイルで使用します。

<MyNamespace:CustomControl1/>

重要な場所を赤字にしています。より重要な場所を太字にしています。

自動生成されるassembly句はフォルダ構成も加味した名前になってしまうため、実際に生成されるアセンブリ名と異なる可能性があります。

今回はこれをそのままコピーしたのでエラーになっていました。そしてこの記載は正しいと思い込んでいたので原因究明に無駄な時間を使っていました。(分かればまあその通りだねっていう感じですね)

 

以上です。
同じようなエラーになっている方の参考になれば幸いです。

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA