为什么这段代码在工作了近一年的时候不能正常工作

时间:2009-04-21 20:22:10

标签: c# .net vb.net assemblies

自动软件更新会导致某些模块属性不起作用吗?我真的很担心我在这里发布的这个功能。它们基本上是从当前正在执行的程序集中读取图像徽标的功能。名为“Get2LogoImageStream”的函数与“Get1LogoImageStream”的区别仅在于Current.ManifestModule.Name与Current.ManifestModule.ScopeName。

这个代码的“Current.ManifestModule.Name”版本适用于Web From app和Windows表单应用程序,但是现在它只适用于Windows App表单。但是,当我用“Current.ManifestModule.ScopeName”更改此代码“Current.ManifestModule.Name”时,它在WEB上运行没有任何问题。所以我对C#或VB.NET开发人员的问题是,自动软件更新会导致这类问题吗?

  protected Stream Get1LogoImageStream()
{
    Assembly current = Assembly.GetExecutingAssembly();
    string imageName = "logo.jpg";
    string file = string.Format("{0}.{1}", current.ManifestModule.ScopeName.Replace(".dll", string.Empty), imageName);
    return current.GetManifestResourceStream(file);
}


protected Stream Get2LogoImageStream()
{
    Assembly current = Assembly.GetExecutingAssembly();
    string imageName = "logo.jpg";
    string file = string.Format("{0}.{1}", current.ManifestModule.Name.Replace(".dll", string.Empty), imageName);
    return current.GetManifestResourceStream(file);
}

4 个答案:

答案 0 :(得分:3)

由于.Name仅返回程序集,而.ScopeName返回完整路径,因此可能导致程序需要徽标文件的绝对路径才能运行。

从那里,它可能是很多东西,我的头脑中的想法: 1)你有一个环境变量存储图像的路径,允许它被找到。

2)您移动了图像或装配体,或以某种方式更改了装配体运行的上下文,以便在错误的位置搜索图像。

3)某些.NET更新有可能需要使用完全限定名称,但我对此表示怀疑。

没有更多细节,很难说。

答案 1 :(得分:1)

您能告诉我们 它是如何使用原始实现的?任何特定的例外情况及其消息?

更新:另外,您是否可以进行一些挖掘以了解最近安装了哪些更新?

更新:所以你在谈论将程序集从.NET 2.0转换为3.0 / 3.5而不是Windows自动更新?这是一个很大的不同。

据我所知,.NET 3.0 / 3.5专门设计为完全向后兼容.NET 2.0组件,因此在3.5上运行2.0程序集应该不是问题。如果您指的是升级.NET 2.0项目/解决方案,那么我不确定。

另一种可能性是,.NET 2.0中可能存在一个在.NET 3.5中得到纠正的错误 - 但这纯粹是猜测。

答案 2 :(得分:1)

我首先要使用System.IO类来处理你正在进行的一些路径操作。 Path类有一个很好的GetFileNameWithoutExtension方法,它应该(ahem)替换你的Replace方法调用(或者甚至可能ChangeExtension,因为这是你似乎试图做的事情。)< / p>

我在NameScopeName方面看到的主要区别在于后者有完整路径而前者没有。这让我认为这是一种路径问题。

正如其他人所说,您是否可以发布一些更多细节,例如您正在获得的错误/例外?

答案 3 :(得分:0)

GetManifestResourceStream()需要您的资源名称,该名称由Namespace.ResourceName.Ext组成。

由于您必须指定命名空间(而不是程序集名称),因此应将其包含在字符串中:

protected Stream Get2LogoImageStream()
{
    Assembly current = Assembly.GetExecutingAssembly();
    string file = "YourNamespace.logo.jpg";
    return current.GetManifestResourceStream(file);
}