У меня есть C# библиотека классов WPF, которая использует (ссылки) SharpVectors . Эта библиотека классов экспортирует функцию в COM, которая создает и показывает окно WPF. COM-клиент - VB6, хотя я не уверен, что это имеет значение.
При запуске я получаю «System. Windows .Markup.XamlParseException» в первой строке XAML для доступа к объекту SharpVectors.
Я думаю, что исключение является чем-то вроде всеобъемлющего; но InnerException содержит:
Сообщение:
Не удалось загрузить файл или сборку 'SharpVectors.Converters.Wpf, PublicKeyToken = b532964b8548be77' или одну из ее зависимостей , Системе не удается найти указанный файл.
Однако SharpVectors.Converters.Wpf.dll
был скопирован в папку bin / Debug вместе с DLL из моего проекта. Как и другие зависимости SharpVectors.
Ниже приведены дополнительные сведения об исключениях.
Когда я запускаю эту же тестовую сборку из C# WPF-приложения, проблем нет. Таким образом, кажется, что время выполнения C# теряет путь к месту сборки при вызове через COM-взаимодействие. Есть ли способ вернуть его в нужное русло?
Стек InnerException:
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.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 Fusion:
=== Pre-bind state information ===
LOG: DisplayName = SharpVectors.Converters.Wpf, PublicKeyToken=b532964b8548be77
(Partial)
WRN: Partial binding information was supplied for an assembly:
WRN: Assembly Name: SharpVectors.Converters.Wpf, PublicKeyToken=b532964b8548be77 | 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 (x86)/Microsoft Visual Studio/VB98/
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: No application configuration file found.
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\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: The same bind was seen before, and was failed with hr = 0x80070002.
Код ниже - самый минимальный пример, который я могу придумать, который воспроизводит проблему. Ошибка возникает в строке <svgc:SvgControl .../>
.
XAML-код:
<Window x:Class="TestSubassembly.MainWindow"
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"
mc:Ignorable="d"
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
Title="TEST" Height="250" Width="256"
>
<svgc:SvgControl Source="sample.svg"/>
</Window>
C# код-позади:
public MainWindow()
{
InitializeComponent();
}
C# COM-видимый класс:
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("...")]
[ComVisible(true)]
public class TestLoader
{
public void Load()
{
var w = new TestSubassembly.MainWindow();
w.Show();
}
}
Код VB6:
Private Sub Form_Load()
Dim l As New TestLoader
l.Load
End Sub
Редактировать: Я также могу воспроизвести это с классами из библиотек, отличных от SharpVectors. Например, средства управления Xceed. Так что это действительно общая проблема с разрешением или загрузкой сборок при структурировании моего приложения.
Кроме того, я попробовал вариант этого, когда библиотеки SharpVector были добавлены непосредственно в мое решение и скомпилированы (без использования библиотек Nuget) - это не имело никакого эффекта; та же проблема.