我正在尝试使用Windows格式anf AxMsTscAxNotSafeForScripting
我有以下方法:
_rdpList = new List<AxMsTscAxNotSafeForScripting>();
public bool addRDP(string ip, string username, string pass)
{
for (int i = 0; i < number ; i++)
{
if (_rdpList[i].Connected.ToString() != "1")
{
try
{
_rdpList[i].Server = ip;
_rdpList[i].UserName = username;
IMsTscNonScriptable secured = (IMsTscNonScriptable) _rdpList[i].GetOcx());
secured.ClearTextPassword = pass;
_rdpList[i].Connect();
_picList[int.Parse(_rdpList[i].Name)].ImageLocation = greenPath;
return true;
}
catch (Exception Ex)
{
MessageBox.Show("Error Connecting", "Error connecting to remote desktop " + ip + " Error: " + Ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
我从线程调用此方法,并尝试执行此操作:IMsTscNonScriptable secured = (IMsTscNonScriptable) _rdpList[i].GetOcx());
失败并出现以下错误:
无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“MSTSCLib.IMsTscNonScriptable”。此操作失败,因为对IID为“{C1E6743A-41C1-4A74-832A-0DD06C1C7A0E}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))
我整天都在努力,但我无法理解这个问题?
奇怪的是,如果我从Windows窗体事件(例如按钮单击)调用此方法,那么当我从我的WCF服务调用此方法时,唯一的问题就出现了。
请帮忙。
答案 0 :(得分:1)
可能有很多解决方案,但我认为最简单的方法是在这里使用dynamic
。据我了解,这是他们创建dynamic
关键字的部分原因。只要你知道界面,那么你可以使用它而不必担心投射。你会失去智力感,但要省去自己在COM上拔头发的麻烦
您的代码如下所示:
dynamic secured = _rdpList[i].GetOcx());
答案 1 :(得分:1)
替换代码:
df=df.copy()
使用:
IMsTscNonScriptable secured = (IMsTscNonScriptable) _rdpList[i].GetOcx());
secured.ClearTextPassword = pass;
注意:如果AdvancedSettings2在对象_rdpList [i]上不可用,请删除对MSTSCLib的引用并再次添加。