none
新手上路:关于整个程序架构? RRS feed

  • 问题

  • 我试着用wpf编写了一个程序,在其中调用了很多资源:三维模型,图片,视频等,我现在面临的问题是:如果我将这些资源都编译成exe或dll文件,则单个程序文件就十分大,可能会到二百多m,窗体加载时肯定会十分吃力。如果不编译成exe文件,则不能保护我的成果,别人会随意从目录下将视频等资源考走。我该如何处理?谢谢!
    diverduan
    2011年5月5日 14:40

答案

  • 我犯了个错误,给了你错误的答案。

    我仔细看了下文档,文档上是这么说的:http://msdn.microsoft.com/zh-cn/library/aa970915.aspx

    在将媒体与应用程序一起分发时,不能将媒体文件用作项目资源。 在项目文件中,必须将媒体类型改设为 Content,并将 Copy To Output Directory 设置为Preserve Newest  Always

    所以,我们不能把媒体文件作为资源封装在程序集发布后,用Pack URI引用的。而且,WPF 的MediaElement还不支持Stream值作为source。

    很遗憾,你的答案可能只能不封装你的媒体文件了。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月9日 10:00
    版主

全部回复

  • 创建一种只包含资源的的程序集,我们叫做卫星程序集Satellite Assembly, 一般的做法是如下:http://msdn.microsoft.com/zh-cn/library/21a15yht.aspx

     

    而对于WPF程序也有简单的方法,你新建一个空的WPF Custom Library 项目,把里面的所有control删除,把你的资源添加到解决方案中,修改每个文件的属性,将BuildAction改成 Resource。这样,就会把你的所有文件编译到dll中去。然后在你要使用里面的资源的时候,可以根据 WPF Pack URI来建立Path去访问,据体 Pack URI参考下面的:http://msdn.microsoft.com/zh-cn/library/aa970069.aspx

     

     

     

    Sincerely,

     

    错误的!!

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

     


    2011年5月5日 16:47
    版主
  • 很有用,感谢!
    diverduan
    2011年5月5日 23:02
  • 我采用第二种方法,建立了一个叫medialib的custom control library ,并引入一个视频。编译后,在主程序中引用,将一个elementmedia的source设为一个uri(pack,application,程序集;文件名),但怎么播放也不行。不知有没有相关的例子看看。
    diverduan
    2011年5月7日 5:13
  • 我犯了个错误,给了你错误的答案。

    我仔细看了下文档,文档上是这么说的:http://msdn.microsoft.com/zh-cn/library/aa970915.aspx

    在将媒体与应用程序一起分发时,不能将媒体文件用作项目资源。 在项目文件中,必须将媒体类型改设为 Content,并将 Copy To Output Directory 设置为Preserve Newest  Always

    所以,我们不能把媒体文件作为资源封装在程序集发布后,用Pack URI引用的。而且,WPF 的MediaElement还不支持Stream值作为source。

    很遗憾,你的答案可能只能不封装你的媒体文件了。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月9日 10:00
    版主
  • 那可惨了,只好爱的奉献了!
    diverduan
    2011年5月9日 12:02
  • 我试了,你的这个回答可能不准确。当我的将让程序集中的视频设为资源,并且不复制时,编译程序,视频将会被编译到exe文件中,文件明显增大。但我再增加一个自定义类库程序集时,将视频按上述办法处理时,再在主程序中引用时,却没反应。现在我面临的问题是只加了一小部分视频,程序文件已经大到了60m,我的4核,4g内存的机器是没什么问题,不知别的机器上会怎么样?
    diverduan
    2011年5月10日 14:19
  • 程序文件的大小跟你的事迹物理内存没有多大关系,一个32位进程会有4GB的寻址空间,Windows默认保留2GB,还有2GB给进程使用。而如果是个64位进程的话,那就更多了,他的寻址空间在目前的所有应用程序来讲,是不可能用完的。所以不管你的文件会有多大,只要你的物理加虚拟内存足够而且是一个64位的程序,那么是不会有内存不足的情况的。

    还有,你提及将文件Build Action设置为资源 (有两种,一种是Resource 资源,WPF中使用的,可以通过Pack Uri访问,我第一个被删除回复中有提及;还有一种是Embedded Resource 内嵌资源,它是最普通的.Net资源嵌入模式,可以通过ResoruceManager来管理访问)

    不光你是哪一种,只要指定了之后,文件就会被嵌入到程序集中,你可以通过一些工具来验证,比如 Reflector 来检测,例如下图就可以显示出我再一个程序集中嵌入的几个图片资源:

    或者一个自己做的工具:http://www.codeproject.com/KB/dotnet/asmex.aspx

    通过工具,我们就可以知道,到底是什么占了空间,凭空说60M很难说服人的。你试试先, 有什么问题随时联系我们。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月11日 3:33
    版主
  • 好,我试试,看来很多问题只有实际使用时才会遇到!
    diverduan
    2011年5月12日 10:34
  • 我用reflector打开没有出现你图片上显示的东西(可能是我的版本不行)。我用ilsky打开,可以看到资源,图片确实可以显示,但视频的部分显示为: //media/show.wmv=system .IO.pinnedbuffermemorystream。
    diverduan
    2011年5月13日 10:21
  • 因为视频文件已文件流形式存储,ilsky这个工具没有针对wmv格式进行解析,所以你只能看到他所存储的文件流类型。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月13日 10:35
    版主