XAML 设计器无法加载文件或程序集

问题描述 投票:0回答:2

我正在尝试提供设计时数据服务,以便我可以在 XAML 中使用一些数据。 我正在使用 OpenhardwareMonitor 库来获取 PC 的硬件信息。

我有代码可以提取“SensorType.Power”类型的所有传感器,并在 ItemsControl 中显示它们:

    <ItemsControl
        ItemsSource="{Binding Sensors}"
        ScrollViewer.HorizontalScrollBarVisibility="Auto"
        ScrollViewer.VerticalScrollBarVisibility="Auto"
        Height="100"
        Margin="5,5,5,0"
        Grid.Row="0">
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type models:HardwareSensorCollection}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <TextBlock Text="{Binding Hardware, Converter={StaticResource HardwareNameTypeConcatConverter}}" Grid.Row="0" />
                    <ItemsControl ItemsSource="{Binding PowerSensors}" DisplayMemberPath="Name" Grid.Row="1" Margin="5,0,0,0" />
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

获取传感器的代码(在运行时)在我视图的 Loaded 事件中执行。在设计时,我简单地将视图模型称为 Loaded() 方法。我正在使用 MVVM,因此我使用以下内容将其传递到我的视图模型:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <cmd:EventToCommand Command="{Binding Mode=OneWay, Path=LoadedCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

获取传感器的代码一切都很好,并且在运行时完美运行。但是,当在设计时执行时,它会在 Visual Studio 的设计视图中生成以下错误:

FileNotFoundException: Could not load file or assembly 'OpenHardwareMonitorLib, Version=0.7.1.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

   at PowerMonitor.DesignData.DesignDataService.<>c__DisplayClass0.<GetHardwareSensorCollections>b__1()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at PowerMonitor.ViewModels.MainViewModel.<Loaded>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

我在VS 2015中工作,但在VS 2013中出现同样的错误。

我想,也许它在运行设计时无法获取传感器,所以我创建了几个继承 IHardware 和 ISensor 的类,这样我就可以像这样初始化它:

var hardwareCollection1 = new HardwareSensorCollection(new DesignHardware("Example Hardware 1", HardwareType.CPU));
hardwareCollection1.PowerSensors.Add(new DesignSensor("Example Sensor 1", SensorType.Power));
hardwareCollection1.PowerSensors.Add(new DesignSensor("Example Sensor 2", SensorType.Power));

var hardwareCollection2 = new HardwareSensorCollection(new DesignHardware("Example Hardware 2", HardwareType.CPU));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 1", SensorType.Power));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 2", SensorType.Power));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 3", SensorType.Power));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 4", SensorType.Power));

return new List<HardwareSensorCollection> { hardwareCollection1, hardwareCollection2 };

但这给了我同样的错误。

我发现了一些有类似问题的人提出的问题,但他们的解决方案都不适合我。我想我必须把这个 DLL 放在某个地方,以便 VS 在调用设计时代码时可以找到它。

有什么想法吗?

c# xaml designer visual-studio-2015
2个回答
0
投票

如果您在 XAML 设计器中遇到此类问题(无法加载文件或程序集),则可能是由于平台所致。我收到这样的消息:

Attempting to load a program with an incorrect format.

在我的输出窗口中,我通过在解决方案配置中从 AnyCPU 切换到 x64 解决了问题。


0
投票

我确认了。项目之间的平台配置差异也可能导致这个问题。
这个问题还没有解决
如果您希望设计器正常工作,您需要确保依赖树中的所有项目都使用相同的平台配置。

© www.soinside.com 2019 - 2024. All rights reserved.