在silverlight中调用外部程序的几种方法总结如下:
1.silverlight不支持oob模式的时候,silverlight调外部应用程序只能通过activex来实现。
大致方法如下,之前写的一个:
var idropItems;
var clsid;
var plugin;
var currentDivIndex;
jQuery(document).ready(function() {
idropItems = window.parent.GetIDropItems();
if (idropItems.length > 0) {
BuildDivContainer();
//activex的clsid,
clsid = "clsid:21E0CB95-1198-4945-A3D2-4BF804295F78";
$("#Pagination").pagination(idropItems.length, {
num_edge_entries: 2,
num_display_entries: 8,
items_per_page: 8,
next_text: "",
prev_text: "",
callback: pageselectCallback
});
}
});
function pageselectCallback(page_id, jq) {
BuildIDropItems(page_id);
}
function BuildIDropItems(pageIndex) {
$("#c_" + currentDivIndex).hide();
if ($("#c_" + pageIndex).attr("loaded") == "0") {
var itemIndex = pageIndex * 8;
var html = "";
for (var i = itemIndex; i < itemIndex + 8; i++) {
if (i < idropItems.length) {
if (idropItems[i].ObjectType == '2') {
var objectName = GetSubstring(idropItems[i].ObjectName.substring(0, idropItems[i].ObjectName.lastIndexOf('.')), 13);
var ext = idropItems[i].ObjectName.substring(idropItems[i].ObjectName.lastIndexOf('.') + 1).toLowerCase();
html += "<div class='ItemBox'>";
html += "<object classid='" + clsid + "' width='101' height='101' >";
html += "<param name='background' value=''>";
html += "<param name='proxyrect' value='0, 0, 101, 101'>";
html += "<param name='griprect' value='0, 0, 101, 101'>";
html += "<param name='package' value='GetIDropItem.aspx?guid=" + idropItems[i].ObjectId + "&type=xml'>";
html += "<param name='validate' value='1'>";
html += "<img src='GetIDropItemguid=" + idropItems[i].ObjectId + ".img' title= />";
html += "</object>";
html += "<span class='ItemName'>" + objectName + "</span>";
html += "</div>";
}
}
}
$("#c_" + pageIndex).html(html).attr("loaded", "1");
}
$("#c_" + pageIndex).show();
currentDivIndex = pageIndex;
}
2.在silverlight4里面,可以在oob模式下可以直接调com组件,如下面代码段:就是通过AutomationFactory调用dt930的com组件
if (Application.Current.InstallState != InstallState.Installed)
Application.Current.Install();
//oob模式,需要提升权限
if (Application.Current.HasElevatedPermissions && System.Windows.Interop.ComAutomationFactory.IsAvailable)
{
///AutomationFactory call com componnnet
dynamic dt = AutomationFactory.CreateObject("DT390COM.DT390");
}
需引用下面的命名空间
using System.Dynamic;
using System.Windows.Interop;
using System.Runtime.InteropServices.Automation;
3.上面2种方法都要求调用的外部程序是com组件,如果不是com组件,又该如何去启动外部程序呢.通过使用WScript.Shell 组件可以打开任何的应用程序
eg using (dynamic shell = AutomationFactory.CreateObject("WScript.Shell"))
{
shell.Run(@"C:\windows\notepad.exe"); //you can open anything
shell.SendKeys(txtTextToSend.Text);
}
除此之外还可以在js中调用
<javascript language="javascipt">{
var shell = new ActiveXObject("WScript.shell");
shell.Run(@"C:\windows\notepad.exe");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2008-08-15 掌握灵活的数据模型 EntityFramework(2)(翻译)
2008-08-15 关于Entity Data model&掌握灵活的数据模型 EntityFramework(1)(翻译)