Как подсказал рецепт Slime, создание библиотеки управления в Visual Studio сначала было гораздо менее болезненным.
Я создал новый проект «Библиотека классов (.NET Framework)» в Visual Studio, вставил в решение существующий синтаксически допустимый код C #, добавил ссылки на соответствующие сборки и создал проект.
Я скопировал полученный файл myDataTemplateSelector.dll в тот же каталог, где находится файл сценария PowerShell.
Я загрузил свежую консоль PowerShell (повторное использование консоли не загрузило сборку правильно) и выполнил следующие команды для проверки DLL:
Add-Type -Path .\myDataTemplateSelector.dll
[myNamespace.myDataTemplateSelector]::New()
Это успешно создало экземпляр моего пользовательского класса.
Наконец, я обновил свой XAML:
xmlns:local="clr-namespace:myNamespace;assembly=myDataTemplateSelectorLibrary"
Приложение WPF теперь работает!
Буду признателен за любые другие ответы, которые могут объяснить, как выполнить то же самое без необходимости компилировать код C # в Visual Studio, поскольку я бы предпочел не полагаться на нечитаемый человеком файл (то есть файл DLL) в этот проект.
Редактировать - полностью ответил:
Предложение рецепта Slice для программного поиска имени сборки вместо того, чтобы полагаться на то, что, как я предполагал, будет (на основе моего кода C #), привело меня по правильному пути. Еще раз спасибо.
При запуске кода C # в PowerShell обычно используется Add-Type, который загружает код только в память.
Если вы укажете исходный код, Add-Type скомпилирует указанный исходный код и сгенерирует сборку в памяти, содержащую новые типы .NET Framework.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/add-type?view=powershell-5.1
Чтобы получить доступ к метаданным для добавленного кода, необходимо использовать параметр -Passthru в Add-Type:
-PassThru
Возвращает объект System.Runtime, представляющий добавленные типы. По умолчанию [Add-Type] не генерирует никакого вывода.
Затем я сохранил вывод исправленной команды Add-Type:
$Type = Add-Type -TypeDefinition $cSharpSource -ReferencedAssemblies $Assemblies -PassThru
Полное имя сборки и доступ:
> $Type.Assembly.Fullname
m0m5m4la, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Первая строка «m0m5m4la» - это необходимое имя сборки, которое создается случайным образом при добавлении типа и действует как ссылка на сборку в памяти.
Наконец, к нему можно получить доступ при запуске сценария и вставить в XAML:
...
$Type = Add-Type -TypeDefinition $cSharpSource -ReferencedAssemblies $Assemblies -PassThru
$AssemblyName = $Type.Assembly.Fullname.Split(",",2)[0]
Add-Type -AssemblyName PresentationFramework
[xml]$XAML = @"
<Window x:Name="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="650" Width="300" FontSize="11"
xmlns:local="clr-namespace:myNamespace;assembly=$($AssemblyName)">
...
Я не уверен, насколько это хакерски, но это работает и позволяет всему коду оставаться в незашифрованном виде, и для продолжения разработки не требуется никаких программных средств (кроме текстового редактора).
Возможно, я недостаточно хорошо искал, но не смог найти ни одного примера такого рода вещей в Интернете. Надеюсь, это кому-нибудь поможет!