Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ClickOnce困境:代码身份与安全性-怎么办?_C#_Wpf_Winforms_Deployment_Clickonce - Fatal编程技术网

C# ClickOnce困境:代码身份与安全性-怎么办?

C# ClickOnce困境:代码身份与安全性-怎么办?,c#,wpf,winforms,deployment,clickonce,C#,Wpf,Winforms,Deployment,Clickonce,我们在应用程序生命周期管理方面有很大的改进空间。我们不使用或任何其他套件(我知道,我们感到羞耻) 无论如何,我们目前考虑的一个方面是代码标识。 换句话说:审核员问我们如何确保被各部门测试和接受的软件是我们为生产性使用而部署的程序集,并且没有任何改动,而不是修改版本。“那很容易”,我们说,“不容易!”。因为一些配置变量是在批准和发布之间设置的,所以ClickOnce散列会有所不同,从而完成整个过程 到目前为止,情况就是这样,但我们希望(并且必须)在我们所做的事情上做得更好,因此无法避免创建无状态且

我们在应用程序生命周期管理方面有很大的改进空间。我们不使用或任何其他套件(我知道,我们感到羞耻)

无论如何,我们目前考虑的一个方面是代码标识。 换句话说:审核员问我们如何确保被各部门测试和接受的软件是我们为生产性使用而部署的程序集,并且没有任何改动,而不是修改版本。“那很容易”,我们说,“不容易!”。因为一些配置变量是在批准和发布之间设置的,所以ClickOnce散列会有所不同,从而完成整个过程

到目前为止,情况就是这样,但我们希望(并且必须)在我们所做的事情上做得更好,因此无法避免创建无状态且不受环境影响的程序集。但是我们必须在运行时设置环境,我们的选项如下:

  • 使用应用程序设置并从ClickOnce哈希中排除应用程序配置。这很糟糕,因为我们不能以这种方式签署ClickOnce清单,所以用户总是会收到“小心,你不认识这个家伙”之类的消息

  • 将查询字符串参数传递给应用程序文件,并使用这些参数区分测试环境和生产环境。我不喜欢这个,因为它太开放了,任何用户都可以控制重要的位(比如dbhost或其他)

  • 传入类似“is_test=1”的内容意味着有很多内联切换正在进行,另一方面,这可能意味着程序集在生产中的行为与在测试中的行为不同,这让我们回到了起点,尽管我们已经确保了程序集的身份


    我认为所有这些都相当不令人满意,必须有更好的方法来做到这一点。这怎么能用很少的方法做到呢(意味着没有TFS或类似的怪物)?

    我只是把ApplicationDeployment类弄得有点乱。我想我现在拥有的和我想要的非常接近

        private static void GetDeploymentEnvironment()
        {
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                ApplicationDeployment dep = ApplicationDeployment.CurrentDeployment;
                FileInfo f = new FileInfo(dep.UpdateLocation.AbsolutePath + ".env");
                if (f.Exists)
                {
                    /// read file content and apply settings
                }
            }
        }
    
    这使我能够将一个文件放在部署文件夹(即.application文件所在的位置)中,以用于覆盖设置。如果没有这样的文件,那么……什么都不会被覆盖。无论我对这个文件的内容做什么,程序集标识都会被保留


    编辑:只是一个提示,正如您所看到的,这仅对部署为仅联机的应用程序有用。在离线可用的场景中,您不能从不同的位置启动相同的ClickOnce.application文件。

    我只是稍微弄乱了ApplicationDeployment类。我想我现在拥有的和我想要的非常接近

        private static void GetDeploymentEnvironment()
        {
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                ApplicationDeployment dep = ApplicationDeployment.CurrentDeployment;
                FileInfo f = new FileInfo(dep.UpdateLocation.AbsolutePath + ".env");
                if (f.Exists)
                {
                    /// read file content and apply settings
                }
            }
        }
    
    这使我能够将一个文件放在部署文件夹(即.application文件所在的位置)中,以用于覆盖设置。如果没有这样的文件,那么……什么都不会被覆盖。无论我对这个文件的内容做什么,程序集标识都会被保留


    编辑:只是一个提示,正如您所看到的,这仅对部署为仅联机的应用程序有用。您不能从脱机可用的场景中的不同位置启动相同的ClickOnce.application文件。

    可能此信息也很重要:ClickOnce部署设置为仅联机。干杯也许这些信息也很重要:ClickOnce部署设置为仅联机。干杯