我们正在使用C#开发一个应用程序。我们将所有资源存储在一个中央资源DLL中,该资源包含我们支持多种文化的图像,图标和字符串。
我们使用以下代码从解决方案中的任何项目访问资源;
private ResourceManager ResMan;
ResMan = new ResourceManager("libResx.Resource", Assembly.ReflectionOnlyLoad("libResx"));
然后我们使用;
访问资源的任何元素btnClose.Text = ResMan.GetString("btnClose");
除了缺少资源DLL之外,还有什么可能导致反射无法找到资源DLL(程序集)。到目前为止,在测试中它已经完美无缺,当它最终被部署到野外时,我们应该注意什么?
反射能否失败?
答案 0 :(得分:3)
它可能会失败。您可以对程序集进行属性以防止来自同一名称空间之外的另一个程序集的反射。
答案 1 :(得分:2)
查看每个API的参考文档,以查看每个API可以抛出的异常列表。
答案 2 :(得分:1)
反射非常有用,但是由于更实际的原因它也会失败。
这最近发生在MVC Web应用程序(Castle MVC,Windsor,Brail& Boo)中。当boo脚本编译&从propertybag访问一个List,它使用反射来识别MyModel的签名,以便它可以引用View的属性。
在此实例中反射失败的情况是MyModel的旧数据库记录不再与新模型同步,因为旧数据具有MyModel的某些新属性或属性的空值。对于在新属性字段中具有值的新记录,这不是问题。
作为一般经验法则,我会将程序集注册为依赖项,并将命名空间放在using子句中。这为编译时编译器提供了清晰的依赖链。它还使其他开发人员更容易识别特定库所依赖的内容,而不必通过一堆代码来查找隐藏的Assembly.Reflection.OnLoad调用外部DLL。
此外,如果您希望您的ResourceManager发生很大变化,您应该考虑将其完全独立地分成单独的dll。 (与SOLID OOP设计原则保持一致)。这使您的应用程序更加模块化,如果您需要更新资源程序集,则只重新编译受影响的库。
答案 3 :(得分:0)
根据我的经验,我发现指定完整路径不是依赖于程序集名称,而是更可靠。您可以改为使用Assembly.ReflectionOnlyLoadFrom
。