WPF:从非执行程序集(dll)加载ImageSource

12 浏览
0 Comments

WPF:从非执行程序集(dll)加载ImageSource

我有一个关于Pack Uri的问题。

我创建了一个WPF .NET 4.5应用程序。我希望它可以很模块化,以便开放给第三方插件;因此我将它分成了三个项目。

我的配置器可执行文件将是主入口点。这个配置器程序集引用了一个Types.dll,其中包含了大部分的基本逻辑。为了我的引导用户界面,我使用了第三个项目,称为UserInterface.dll。

现在,我的types.dll包含一个图像文件,我想将其作为资源在我的UserInterface.dll中使用。

如果我尝试这样调用它:

Image img = new Image();
img.Source = new BitmapImage(new Uri("/Types;component/Resources/myPicture.png", UriKind.Relative);

图像将不会显示出来,因为它找不到。我的执行程序集是UserInterface.dll,但Types.dll在Visual Studio中被引用。使用绝对Uri(application,,,)也会有相同的效果。

我使用了一个解决方法,将我的图像定义为资源(项目属性),加载Drawing.Bitmap,将其转换为ImageSource,并将其分配给我的图像。但我认为这样的性能不如直接通过ImageSource加载。

所以我的问题是:当两个程序集都不是主应用程序时,我如何从一个调用程序集中加载另一个调用程序集中的资源?

谢谢你的帮助。

编辑:

图像的生成操作设置为资源。

0
0 Comments

问题原因可能是由于.NET 4.5.1存在一些问题,或者错误出现在其他地方。将.NET 4.5切换回来可以解决该问题。引用来自引用的dll的资源也可以使用uri来实现。如果我找到了我做错的地方,我会更新这个解决方法。

非常感谢你的帮助,Rohit,应用程序现在可以正常工作了。我不知道我是如何做到的,但我做到了 🙂 谢谢你花时间制作一个样例解决方案,在发布这里之前应该先这样做...

我想知道问题是从哪里来的。我按照你的建议创建了一个小样例,并得到了与你相同的结果。我回到我的应用程序中查看我在那里做了什么不同的地方。首先,我检查了WPF程序集的所有引用。它们都和我的新样例项目一样。我将我的应用程序切换回.NET 4.5(从.NET 4.5.1),然后它也在我的应用程序中工作了。之后,我又切换回.NET 4.5.1,看看是否会再次出现错误-但它仍然工作。它甚至不能是一个拼写错误,因为我两次都使用了相同的代码(将其注释掉)。那么是什么原因导致了这个问题?也许你有什么想法?

最有可能只是缺少了重建。切换框架可能导致与重建相同的结果。参见https://stackoverflow.com/a/11948876/3090544

0
0 Comments

问题的原因是在WPF中,当尝试从一个非执行程序集中加载图像资源时,需要更详细的定义Pack URI。解决方法是根据"Pack URI in WPF"文档中的"Referenced Assembly Resource File"部分进行操作。具体操作如下:

首先,确保将myPicture.png的"Build Action"设置为"Resource"。然后,使用更详细的Pack URI定义加载图像资源。代码示例如下:

img.Source = new BitmapImage(new Uri("pack://application:,,,/Types;component/Resources/myPicture.png");

此代码中,"pack://application:,,,/Types"表示从当前应用程序集中查找名为"Types"的dll。如果在同一文件夹中存在该dll,则应该能够找到资源。在小型示例中,此方法可以正常工作。如果问题仍然存在,请将示例代码上传至云端,以便我们进行查看。

0