代码在本地与服务器上执行不同

Posted

技术标签:

【中文标题】代码在本地与服务器上执行不同【英文标题】:Code not executing the same on local vs server 【发布时间】:2012-05-29 22:30:11 【问题描述】:

我有一些基于色调进行键色替换的 C# 代码。在我的本地机器上,它运行良好。但是,当我将它推送到服务器时,它会替换“一些”但不是所有颜色。这就像它只是决定不运行部分代码。

图像是无损 PNG - 它们在服务器上完好无损。这是某种线程问题吗?我的代码在这里没有线程化(超出网络服务器所做的),但有没有人见过类似的事情发生?

如果我提到此代码在单独的库项目中编译然后从 MVC3 应用程序中引用,这也可能会有所帮助。

谢谢,这里是代码示例:

private void _ReplaceImageColor(Image img, Color baseColor, Color newColor)

    Bitmap bmp = (Bitmap)img;
    double baseHue = baseColor.GetHue();
    for (int x = 0; x < bmp.Width; x++)
    
        for (int y = 0; y < bmp.Height; y++)
        
            double pixelHue, pixelSat, pixelVal;
            ColorProcessor.ColorToHSV(bmp.GetPixel(x, y), out pixelHue, out pixelSat, out pixelVal);
            if (pixelHue == baseHue)
            
                Color setColor = ColorProcessor.ColorFromHSV(newColor.GetHue(), pixelSat, pixelVal);
                bmp.SetPixel(x, y, setColor);
            
        
    

这是ColorProcessor 的方法,因为人们问...

public static void ColorToHSV(Color color, out double hue, out double saturation, out double value)

    int max = Math.Max(color.R, Math.Max(color.G, color.B));
    int min = Math.Min(color.R, Math.Min(color.G, color.B));

    hue = color.GetHue();
    saturation = (max == 0) ? 0 : 1d - (1d * min / max);
    value = max / 255d;


public static Color ColorFromHSV(double hue, double saturation, double value)

    int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
    double f = hue / 60 - Math.Floor(hue / 60);

    value = value * 255;
    int v = Convert.ToInt32(Math.Max(value, 0));
    int p = Convert.ToInt32(Math.Max(value * (1 - saturation), 0));
    int q = Convert.ToInt32(Math.Max(value * (1 - f * saturation), 0));
    int t = Convert.ToInt32(Math.Max(value * (1 - (1 - f) * saturation), 0));

    if (hi == 0)
        return Color.FromArgb(255, v, t, p);
    else if (hi == 1)
        return Color.FromArgb(255, q, v, p);
    else if (hi == 2)
        return Color.FromArgb(255, p, v, t);
    else if (hi == 3)
        return Color.FromArgb(255, p, q, v);
    else if (hi == 4)
        return Color.FromArgb(255, t, p, v);
    else
        return Color.FromArgb(255, v, p, q);

【问题讨论】:

ColorProcessor 来自哪里? 你需要先做一些调查。您能否创建一个数据测试以在两者上使用并将其缩小到单个失败的数据。然后调查代码中的异常? 我认为这里值得一提:阅读此链接中的 Caution 框,指向 MSDN 上的 System.Drawing 命名空间:msdn.microsoft.com/en-us/library/xs6ftd89 对不起,ColorProcessor 是另一个班级,我必须为这个项目管理一堆其他颜色任务。如果您需要那里的代码,我会发布它。这里我只是将 RGB 转换为 HSV 值,用于基于色调的颜色匹配。 感谢 Beemer,它不是一个 .NET 服务,它只是一个 MVC3 应用程序。我已经这样做了几十次,但这是第一次发生任何奇怪的事情。 Preet - 一切正常,除了在服务器上跳过了一些关键颜色。每次都以同样的方式发生。 【参考方案1】:

您可能需要非常仔细地检查您的 dll 引用在服务器上与在开发机器上是否相同。 Hanselman 最近有一篇关于这件事的文章:Confirm Your Expectations and Version Numbers in Production Environments

此外,由于它在调试和发布模式下的行为不同,请检查它在构建中使用相同的位数以消除可能在浮点数上表现出来的潜在变化(例如 x86)。

【讨论】:

现在所有版本看起来都一样,但这只是在我的本地机器上以发布模式构建时发生的......这是什么意思? 这听起来像一个 Heisenbug,它的行为因环境而异。这些都很难解决。确保确定构建中的位数以消除潜在的变化(例如 x86)。另请查看:***.com/questions/4787082/… 见鬼!我敢打赌你是对的。这是处理双精度数(HSV),我应该知道浮点数会影响到我……我会调查的。 这就是问题所在,谢谢。当在浮点上使用== 时,.NET 编译器应该只是抛出一个警告...... 没问题,很高兴你解决了这个难题。我将修改答案以包含来自 cmets 的其他详细信息。

以上是关于代码在本地与服务器上执行不同的主要内容,如果未能解决你的问题,请参考以下文章

本地代码与托管代码

WinForm窗体重要属性与公共控件的重要属性

取消本地SVN文件夹与服务器关联

Git与Github。

linux环境变量与本地变量

WebSocket 服务器能否与 HTTP Apache 服务器共存于同一公共端口(80),但本地地址不同?