我正在编写的程序正在使用System.Management.Automation库来使用那里定义的powershell类和接口.这些库有两个版本:1.0.0.0和3.0.0.0.Windows Server 2008在其GAC版本1.0中,Windows Server 2012在其GAC中具有1.0和3.0.
为了能够在VS项目中使用此库,我必须引用它.现在这是一个决定,我应该参考哪一个?好吧,既然两台服务器的GAC都是1.0,那么引用1.0的服务器应该是安全的.不过,为了以防万一,我会在本地复制它,如果有一些罕见的(或常见的?)情况,它在GAC中不存在.
使用此库的示例代码:
using (PowerShell PS = PowerShell.Create())
{
PS.AddScript("Import-Module ServerManager")
.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
该Import-Module Servermanager命令导致powershell导入另一个dll , Microsoft.Windows.ServerManager. 问题开始了.
Windows Server 2008只有此库的版本6.1.0.0,其中Windows Server 2012的版本为6.3.0.0.我假定那Automation的1.0〜6.1和3.0〜6.3版本相似度不巧合.
当我在Windows Server 2008上使用我的程序时,它工作正常,但当我尝试在Windows Server 2012上使用它时,此Automation 1.0程序集正在尝试加载2012年没有的ServerManager程序集版本6.1(!).2012年更愿意使用Automation assembly v3.0并加载ServerManager v6.3.
我假设有一些方法可以"告诉"程序加载程序集X,如果服务器版本Y和程序集A,如果服务器版本B,但它在哪里?我怎么能确定我不会遇到一些服务器,其中将有2.0或4.0或其他版本.
问题是我无法引用(本地复制)ServerManager程序集,因为(我认为),只要我能"告诉" 我的程序应该在哪里查找程序集,我无法告诉自动化程序集在何处查找其他组件.通过使用procmon进行分析,我可以看到它确切地知道在哪里寻找,因为它立即导航C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager到寻找ServerManager程序集.
我所知道的可能解决方案是:
我可以尝试动态加载程序集而不引用它们在视觉研究中使用Assembly.Load()和dynamic对象使用,如有人建议的那样,我应该在火热的地狱中燃烧(我假设那个人提到它非常容易出错).
我可以将我需要的程序集添加到GAC,但这可能导致一些依赖地狱,因为Automation和ServerManager可能有很多其他依赖项,我现在才发现其中的两个.
我还有其他选择吗?
我在功能区上有一个按钮来检查AddIn(本身)更新
这是代码
private void button1_Click(object sender, RibbonControlEventArgs e)
{
UpdateCheckInfo info = null;
if (ApplicationDeployment.IsNetworkDeployed)
{
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
var appId = new ApplicationIdentity(ad.UpdatedApplicationFullName);
var unrestrictedPerms = new PermissionSet(PermissionState.Unrestricted);
var appTrust = new ApplicationTrust(appId)
{
DefaultGrantSet = new PolicyStatement(unrestrictedPerms),
IsApplicationTrustedToRun = true,
Persist = true
};
ApplicationSecurityManager.UserApplicationTrusts.Add(appTrust);
info = ad.CheckForDetailedUpdate();
if (info.UpdateAvailable)
{
ad.Update();
MessageBox.Show("DONE");
}
}
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是我收到"完成"消息框但重新启动Excel后,插件实际上没有更新,我无法再次更新它,因为下次我点击相同的按钮时,ApplicationDeployment.IsNetworkDeployed返回false.
我怎样才能解决这个问题?
我有一个从X509Store检索到的X509Certificate2对象。我想获取此证书的颁发者,但此对象提供的仅有的两个属性是X509Certificate2.Issuer和X509Certificate2.IssuerName,.Issuer因为它会还原基本上是颁发者名称的字符串,因此有点误导。
这两个属性最多都可以返回专有名称,但是DN不是唯一的,对不对?因此,我不想将X509Certificate2Collection.Find方法与X509FindType.FindByIssuerDistinguishedName标志一起使用。
如何获得证书的颁发者,并确保我拥有“正确的证书”。注意:我不必使用X509Certificate2对象。欢迎其他选择。
我正在构建一个简单的应用程序,它应该通过socks4/5 代理发送UDP 数据报包。我使用 UDP 方法,因此不必保持连接打开。
然而,这并不像我想象的那么容易。根据此架构,我得出结论,如果不先与代理服务器建立 TCP 连接,则无法通过代理发送 UDP 数据。

尽管如此,我找不到在 CPP 中建立这种连接的任何合适的例子。我将不胜感激任何资源:)
我有以下字符串This is ${name} ${surname}.这个字符串是不可替代的
现在,我需要更换${name},并${surname}用自己的数据.我想使用sed/awk,但是当我输入时
string="This is ${name} ${surname}"
echo $string | awk '{... gsub() ...}'
Run Code Online (Sandbox Code Playgroud)
然后问题是,awk我只是This is因为已经echo解决了${},因为它是空的.
我不知道我是否可以使用类似的东西
awk <<EOF
This is ${name} ${surname}
EOF
Run Code Online (Sandbox Code Playgroud)
因为我需要把它包装成变量,因为bash是oneliner我不能那样打字
VAR=$(awk <<
This is ${name} ${surname}
EOF)
Run Code Online (Sandbox Code Playgroud)
谢谢你的时间