C# 作为我的dll。如果我添加了一个基于URL的安全设置,我可以运行插件OK。我还没有解决PIA.msi和VSTO.msi的安装问题,但我认为我不需要解决,因为我的开发机器已经安装了它们。如果我没有在安装中包含这些,我的应用程序将不会运行。我不确定我还需要做什

C# 作为我的dll。如果我添加了一个基于URL的安全设置,我可以运行插件OK。我还没有解决PIA.msi和VSTO.msi的安装问题,但我认为我不需要解决,因为我的开发机器已经安装了它们。如果我没有在安装中包含这些,我的应用程序将不会运行。我不确定我还需要做什,c#,security,excel,installation,vsto,C#,Security,Excel,Installation,Vsto,作为我的dll。如果我添加了一个基于URL的安全设置,我可以运行插件OK。我还没有解决PIA.msi和VSTO.msi的安装问题,但我认为我不需要解决,因为我的开发机器已经安装了它们。如果我没有在安装中包含这些,我的应用程序将不会运行。我不确定我还需要做什么来安装这些。我确信我已经在我的开发环境之外做过几次了。你可以正常地安装PIA和VSTO程序集,你不需要专门设置这些程序集的安全性。我会这样做(首先关闭所有office应用程序):1。安装PIA 2。将VS3安装到运行时3。安装插件4。设置插件


作为我的dll。如果我添加了一个基于URL的安全设置,我可以运行插件OK。我还没有解决PIA.msi和VSTO.msi的安装问题,但我认为我不需要解决,因为我的开发机器已经安装了它们。如果我没有在安装中包含这些,我的应用程序将不会运行。我不确定我还需要做什么来安装这些。我确信我已经在我的开发环境之外做过几次了。你可以正常地安装PIA和VSTO程序集,你不需要专门设置这些程序集的安全性。我会这样做(首先关闭所有office应用程序):1。安装PIA 2。将VS3安装到运行时3。安装插件4。设置插件的安全性不要将PIA和VSTO运行时与应用捆绑在一起。将它们从项目生成中排除。Microsoft为那些不需要单独设置安全策略的安装程序提供单独的安装程序。
        string solutionInstallationLocation = Path.GetDirectoryName(assemblyPath);
        string solutionInstallationUrl = Path.Combine(solutionInstallationLocation, "*");

        string policyLevel;
        string parentCodeGroup;
        if (machinePolicyLevel)
        {
            policyLevel = "-m"; // Use Machine-level policy.
            parentCodeGroup = "My_Computer_Zone"; // Use My_Computer_Zone for assemblies installed on the computer.
        }
        else
        {
            policyLevel = "-u"; // Use User-level policy.
            parentCodeGroup = "All_Code";
        }

        // Add the solution code group. Grant no permission at this level.
        string arguments = policyLevel + " -q -ag " + parentCodeGroup + " -url \"" + solutionInstallationUrl + "\" Nothing -n \"" + solutionCodeGroupName + "\" -d \"" + solutionCodeGroupDescription + "\"";
        try
        {
            RunCaspolCommand(frameworkFolder, arguments);
        }
        catch (Exception ex)
        {
            string error = String.Format("Cannot create the security code group '{0}'.", solutionCodeGroupName);
            throw new Exception(error, ex);
        }

        // Add the assembly code group. Grant FullTrust permissions to the main assembly.
        try
        {
            // Use the assembly strong name as the membership condition.
            // Ensure that the assembly is strong-named to give it full trust.
            //AssemblyName assemblyName = Assembly.LoadFile(assemblyPath).GetName();
            //arguments = policyLevel + " -q -ag \"" + solutionCodeGroupName + "\" -strong -file \"" + assemblyPath + "\" \"" + assemblyName.Name + "\" \"" + assemblyName.Version.ToString(4) + "\" FullTrust -n \"" + assemblyCodeGroupName + "\" -d \"" + assemblyCodeGroupDescription + "\"";

            //RunCaspolCommand(frameworkFolder, arguments);
            //TODO- MS Hardcoded for now (better at assembly dll level use todo 1)
            arguments = policyLevel + " -q -ag \"" + solutionCodeGroupName + "\" -url \"" + solutionInstallationUrl + "\" FullTrust -n \"" + assemblyCodeGroupName + "\" -d \"" + assemblyCodeGroupDescription + "\"";
            RunCaspolCommand(frameworkFolder, arguments);
            //TODO: 1 code below will create a separate group per assembly path, also need to check if AcnUI assembly is installed in GAC.
            //AddFullTrust(frameworkFolder, assemblyPath, policyLevel, solutionCodeGroupName, assemblyCodeGroupName, assemblyCodeGroupDescription);
        }
        catch (Exception ex)
        {
            try
            {
                // Clean the solutionCodeGroupName.
                RemoveSecurityPolicy(machinePolicyLevel, solutionCodeGroupName);
            }
            catch {}

            string error = String.Format("Cannot create the security code group '{0}'.", assemblyCodeGroupName);
            throw new Exception(error, ex);
        }
    }

    internal static void RemoveSecurityPolicy(
        bool   machinePolicyLevel,
        string solutionCodeGroupName)
    {
        string frameworkFolder = GetFrameworkFolder();
        string policyLevel;
        if (machinePolicyLevel)
            policyLevel = "-m"; // Use Machine-level policy.
        else
            policyLevel = "-u"; // Use User-level policy.

        string arguments = policyLevel + " -q -rg \"" + solutionCodeGroupName + "\"";
        RunCaspolCommand(frameworkFolder, arguments);
    }

    private static string GetFrameworkFolder()
    {
        // Get the targeted Framework folder.
        Version version = new Version(2, 0, 50727);
        return GetRuntimeInstallationDirectory(version, true);
    }