在没有引用的情况下从 xap 加载 Prism 中的模块

发布于 2024-11-02 12:28:02 字数 869 浏览 3 评论 0原文

我正在使用 Prism 4 和 Unity。我有一个主项目和一个模块。该模块被创建为 Silverlight 应用程序,因此它构建了一个单独的 xap 文件。

我将模块加载到 Bootstrapper 的ConfigureModuleCatalog 中,就像文档所述一样。

var moduleType = typeof (MyModule);
this.ModuleCatalog.AddModule(
    new ModuleInfo
    {
       ModuleName = moduleType.Name,
       ModuleType = moduleType.AssemblyQualifiedName,
       InitializationMode = InitializationMode.WhenAvailable,
    });

一切正常,但我注意到我的主 xap 文件还包含与我的模块关联的 dll。因此,我在模块引用上设置 Copy Local = False,并且它仅在模块 dll 自己的 xap 文件中正确构建。

但现在我的应用程序无法运行,因为我无法获取 MyModule 的类型信息。我收到 FileNotFoundException。

我发现如果我手动输入 ModuleName 和 ModuleType,并且还在 ModuleInfo 上设置 Ref = "MyModule.xap",则可以完全删除引用。这工作正常,但问题是:我经常构建并使用动态版本号。所以 AssemblyQualifiedName 太容易改变了。如果没有引用,就无法动态获取它。如果我从 AssemblyQualifiedName 中删除版本号,它将不起作用。

当然还有其他方法可以让模块从它自己的 xap 文件加载,而不会最终出现在主 xap 中吗?

I'm using Prism 4 with Unity. I have a main project, and a module. The module is created as Silverlight Applications, so it builds a separate xap file.

I load the modules in the Bootstrapper's ConfigureModuleCatalog, just like the documentation states.

var moduleType = typeof (MyModule);
this.ModuleCatalog.AddModule(
    new ModuleInfo
    {
       ModuleName = moduleType.Name,
       ModuleType = moduleType.AssemblyQualifiedName,
       InitializationMode = InitializationMode.WhenAvailable,
    });

Everything works fine, but I notice that my main xap file also contains the dlls associated with my module. So, I set Copy Local = False on the module reference, and it builds correctly with the module dlls only in their own xap file.

But now my app won't run because I can't get the type information for MyModule. I get a FileNotFoundException.

I found that I can drop the reference entirely if I manually enter the ModuleName and ModuleType, and also set Ref = "MyModule.xap" on the ModuleInfo. This works fine, but here's the problem: I build frequently and use dynamic verion numbers. So the AssemblyQualifiedName changes too easily. Without the reference, there's no way to get it dynamically. If I drop the version number from the AssemblyQualifiedName, it doesn't work.

Surely there's some other way to get the module to load from its own xap file without it ending up also in the main xap?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野心澎湃 2024-11-09 12:28:02

没关系...

经过进一步研究,我的错误似乎是在汇编版本中使用通配符版本控制。许多站点建议仅在程序集文件版本中使用通配符,并在程序集版本上使用固定版本号。然后我可以删除引用并通过具有固定版本号的强名称来引用模块。

我对这个问题非常着迷。直到我考虑了一般的装配位置后我才弄清楚。实际上为我解决这个问题的帖子是关于解决共享点部分的。只是表明有时你必须跳出框框思考。

更新

看起来你不能在文件版本中使用通配符... grr...我找到了一个可以使用的加载项 http://autobuildversion.codeplex.com/

有人有更好的主意吗?

Nevermind...

After researching further, it seems my mistake is in using wildcard versioning in the assembly version. It is suggested on many sites to use the wildcard in the assembly FILE version only, and use fixed version numbers on the assembly version. Then I can just drop the reference and refer to the module by its strong name with fixed version number.

I was so locked in to prism on this one. I didn't figure it out until I thought about assembly location in general. The post that solved it for me actual was about resolving sharepoint parts. Just goes to show sometimes you have to think outside the box.

Update

Looks like you can't use the wildcard in the file version... grr... I found an add-in that will work though http://autobuildversion.codeplex.com/

Anyone got a better idea?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文