微软.WindowsCE.Forms出现奇怪的行为

6

我有一个Windows Mobile应用程序,我想要检查设备的方向。因此,我在其中一个表单中编写了以下属性:

internal static Microsoft.WindowsCE.Forms.ScreenOrientation DeviceOriginalOrientation { get; private set; }

奇怪的是,自从这件事发生后,每当我打开用户控件时,即使该用户控件不使用该属性,设计器也会显示此警告: 无法加载文件或程序集“Microsoft.WindowsCE.Forms,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 969db8053d3322ac”或其某个依赖项。找到的程序集清单定义与程序集引用不匹配。(HRESULT 的异常:0x80131040) 注释上述属性将解除警告并再次显示用户控件。 应用程序在两种情况下都可以成功构建和运行,有人知道为什么会发生这种情况以及如何修复吗?

如果您删除static关键字会发生什么? - Thorsten Dittmar
设计师显示错误信息。 - mrtaikandi
你的应用程序中是否引用了特定版本(3.5.0.0)?这可能是由于你在引用中分配的版本与设计师实际找到的版本不匹配所致。 - Tom van Enckevort
当我使用输入控件时,引用会自动添加。但我也尝试直接引用到“Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE”。 - mrtaikandi
3个回答

4

这个问题让我花费了几个小时的时间。我通过使用gacutil将Microsoft.WindowsCE.Forms.dll添加到GAC中来解决它。希望它能有所帮助。 Robin


2
是的,这基本上是可以预料的。由于它是一个静态属性(我首先不同意),设计师必须初始化它,这意味着加载Microsoft.WindowsCE.Forms,这意味着加载特定于设备的入口点。诚然,错误消息很糟糕,但是设备支持的设计师支持存在很多有趣的问题,很难找出原因。
我建议尝试将其移动到另一个类或使用检查包装以查看是否在设计师中。像这样的东西对我们有效:
protected bool IsDesignTime
{
    get
    {
        // Determine if this instance is running against .NET Framework 
        // by using the MSCoreLib PublicKeyToken
        System.Reflection.Assembly mscorlibAssembly = typeof(int).Assembly;
        if ((mscorlibAssembly != null))
        {
            if (mscorlibAssembly.FullName.ToUpper().EndsWith("B77A5C561934E089"))
            {
                return true;
            }
        }
        return false;
    }
}

1
如果您将Microsoft.WindowsCE.Forms.dll复制到项目的子文件夹中,然后将以下内容添加到项目的预构建事件中,即使您重新安装PC,它也可以正常工作:
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i "$(ProjectDir)SubFolder\Microsoft.WindowsCE.Forms.dll"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接