[转]使用C#开发ActiveX控件

 

前言

ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件。

虽然本文通篇都在讲如何使用C#语言开发ActiveX控件,但我并不极力推荐使用这种技术,因为该技术存在明显的局限,即需要浏览器端安装.NET Framework(版本取决于开发ActiveX控件使用的.NET Framework版本),该局限对于挑剔的互联网用户,几乎是不可接受的。所以,我建议以下几条均满足时,方可考虑使用该技术:

  • 开发团队中没有人掌握使用C++/VB开发ActiveX控件技术;
  • 该ActiveX控件不用于互联网;
  • 用户对仅能使用IE浏览器访问表示可以接受;
  • 用户对在浏览器端安装.NET Framework组件表示可以接受。

另外,我建议如果不是因为控件的依赖库基于更高版本的.NET Framework,或需要更高版本的.NET Framework提供的扩展功能(如需要WCF等),尽量在.NET Framework 2.0上开发ActiveX控件,因为.NET Framework 2.0只有20M,相比300M的.NET Framework 3.5和40M的.NET Framework 4.0都要小很多,对客户端操作系统的要求也要低很多,并且随着Windows版本的不断升级换代,Windows Vista以后的版本已经内置了.NET Framework 2.0。等到Windows XP系统寿终正寝之时,也将迎来该技术的春天。所以,别被我上面的建议夯退了,掌握该技术其实还是蛮有实用价值的,毕竟,C#高效的开发效率很有吸引力。

本文接下来将使用C#语言开发一个ActiveX控件,实现对浏览器端的MAC地址遍历功能;另外,提供一个在Web静态页面中调用该控件的测试实例。本实例的开发环境为Visual Studio 2010旗舰版(SP1),目标框架为.NET Framework 2.0;浏览器端测试环境为Windows 7旗舰版,IE8。

 

控件开发

使用C#进行ActiveX控件开发过程其实很简单。首先,在解决方案中添加一个类库项目,目标框架使用.NET Framework 2.0,如图1所示:

 

1创建ActiveX控件类库

此处有一个关键操作,需要设置类库项目属性->程序集信息->使程序集COM可见,如图2所示:

 

2设置ActiveX控件类库程序集COM可见

ActiveX类库的内容大致包括两部分,IObjectSafety接口和实现该接口的控件类。考虑所有控件类都要实现IObjectSafety接口,可以将该接口的实现抽象为一个控件基类。

一、IObjectSafety接口

为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值),接口内容如下:

[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{[PreserveSig]int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);[PreserveSig()]int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
}

二、ActiveXControl控件基类

public abstract class ActiveXControl : IObjectSafety
{#region IObjectSafety 成员private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;private const int S_OK = 0;private const int E_FAIL = unchecked((int)0x80004005);private const int E_NOINTERFACE = unchecked((int)0x80004002);private bool _fSafeForScripting = true;private bool _fSafeForInitializing = true;public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions){int Rslt = E_FAIL;string strGUID = riid.ToString("B");pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;switch (strGUID){case _IID_IDispatch:case _IID_IDispatchEx:Rslt = S_OK;pdwEnabledOptions = 0;if (_fSafeForScripting == true)pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;break;case _IID_IPersistStorage:case _IID_IPersistStream:case _IID_IPersistPropertyBag:Rslt = S_OK;pdwEnabledOptions = 0;if (_fSafeForInitializing == true)pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt = E_NOINTERFACE;break;}return Rslt;}public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions){int Rslt = E_FAIL;string strGUID = riid.ToString("B");switch (strGUID){case _IID_IDispatch:case _IID_IDispatchEx:if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&(_fSafeForScripting == true))Rslt = S_OK;break;case _IID_IPersistStorage:case _IID_IPersistStream:case _IID_IPersistPropertyBag:if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&(_fSafeForInitializing == true))Rslt = S_OK;break;default:Rslt = E_NOINTERFACE;break;}return Rslt;}#endregion
}

三、MacActiveX控件类

[Guid("65D8E97F-D3E2-462A-B389-241D7C38C518")]
public class MacActiveX : ActiveXControl
{public string GetMacAddress(){var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");var mos = mc.GetInstances();var sb = new StringBuilder();foreach (ManagementObject mo in mos){var macAddress = mo["MacAddress"];if (macAddress != null)sb.AppendLine(macAddress.ToString());}return sb.ToString();}
}

注意,第一行指定的Guid值即为该ActiveX控件的唯一标识,请保证其唯一性。Guid的生成有多种方法,你可以在系统目录的Program Files目录搜索一个名为guidgen.exe的工具,用该工具产生;也可以写一段测试代码,调用Guid.NewGuid()方法产生;有的Visual Studio版本也提供了快捷方式,在“工具->生成GUID”菜单下。另外,访问MAC需要添加对System.Management系统组件的引用。

到此,控件类库的开发工作就做完了,整个实现过程确实很简单。

 

发布

C#开发的ActiveX控件类库不像OCX那样可以直接通过regsvr32.exe注册(实际上,微软提供了替工具regasm.exe,但由于这种方式要不能实现自动升级,所以本文就不介绍了),要使控件类库运行于浏览器端,可以采取两种方式,一种是将控件类库打包为MSI安装包,然后直接在浏览器端安装;另一种是将MSI再封装为一个CAB包,这个CAB包就是一个ActiveX控件了,可以将它随应用程序一并发布,浏览器端访问包含有该控件的页面时,就会自动提示安装了。接下来就后一种发布方式进行详细讲解。

一、安装项目

在解决方案中添加一个安装项目,如图3所示:

 

3添加安装项目

右键点击新添加的安装项目,依次选择“添加->项目输出”菜单,打开添加项目输出组对话框,并选择ActiveX控件类库“CSharpActiveX”作为主输出,如图4所示:

 

4添加项目输出

双击安装项目检测到的依赖项“Microsoft .NET Framework”,打开安装项目的启动条件界面,选中“.NET Framework”项,如图5所示:

 

5安装项目启动条件

按F4快捷键,打开属性窗口,设置.NET Framework项的Version为“.NET Framework 2.0”,如图6所示:

 

6设置安装项目的依赖框架

下面这步很关键,选中“主输出来自CSharpActiveX(活动)”项,如图7所示:

 

7主输出内容项

设置主输出项内容的Register属性值为vsdrpCOM,如图8所示:

 

8设置主输出项属性

二、制作CAB包

Visual Studio 2010提供了CAB项目模板,但非常遗憾,无论我怎么设置,其生成的CAB安装包都不能在终端成功安装,最终只能放弃,转而选择了makecab.exe工具。源码提供了该打包工具,位于CAB目录下,共包含makecab.exe、cab.ddf、installer.inf和makecab.bat四个文件,其中cab.ddf和installer.inf文件需要简单说明下。

cab.ddf文件定义了CAB文件的打包行为,内容包括打包参数,打包内容项以及输出文件等。需要指出的是,使用C#开发的ActiveX控件CAB包中需要包含MSI文件和installer.inf安装文件两部分。cab.ddf文件内容如下:

.OPTION   EXPLICIT
.Set Cabinet=on
.Set Compress=on
.Set MaxDiskSize=CDROM
.Set ReservePerCabinetSize=6144
.Set DiskDirectoryTemplate="."
.Set CompressionType=MSZIP
.Set CompressionLevel=7
.Set CompressionMemory=21
.Set CabinetNameTemplate="CSharpActiveX.CAB"
"installer.inf"
"CSharpActiveX.msi"

installer.inf文件定义了CAB文件的安装行为,作为控件的一部分打入CAB包中,其内容如下:

[Setup Hooks]
hook1=hook1[hook1]
run=msiexec /i %EXTRACT_DIR%\CSharpActiveX.msi /qn[Version]
Signature= "$CHICAGO$"
AdvancedInf=2.0

makecab.bat文件是调用makecab.exe进行打包的批处理文件,内容如下:

makecab.exe   /f   "cab.ddf"

当生成安装项目后,将CSharpActiveX.msi文件拷贝到CAB目录下,就可以双击makecab.exe文件进行打包了,执行完成后会输出CSharpActiveX.CAB文件,这就是所谓的ActiveX控件了。

三、签名

IE采用了AuthentiCode代码签名技术,对浏览器端安装ActiveX控件行为进行了控制。上面生成的ActiveX控件如果想在浏览器端成功安装,需要对浏览器进行设置,具体操作参见部署章节。

让所有用户都对IE进行设置,显得不太友好,为此,我们可以考虑使用AuthentiCode技术对ActiveX控件进行签名。Visual Studio 2010附带的signtool.exe(以前版本的VS提供的是另一个工具signcode.exe)代码签名工具可以完成该工作(注意,并非一定要用微软提供的工具进行签名,只要按照AuthentiCode技术标准,使用 PKCS#7标准定义的数据结构生成待签名文件的数字签名,并加入到待签名文件的PE结构中即可)。但需要先准备一个PKCS#12(证书及私钥)文件(.pfx),注意,该证书的增强型密钥用法须包含代码签名这项,如图9所示:

 

9代码签名证书

本文源码提供了一份测试PKCS#12文件Apollo.pfx,PIN码为11111111。在Visual Studio命令提示(2010)中,进入源码的CAB目录,输入如下命令即可对ActiveX控件进行签名操作了:

signtool sign –f Apollo.pfx –p 11111111 CSharpActiveX.CAB

图10对比了签名前后的ActiveX控件文件属性,可以看出,签名后的ActiveX控件属性中已经多了一项数字签名,表示该文件已经过签名。

 

10签名前后的ActiveX控件属性对比

出于方便考虑,本文源码的CAB目录下提供了一份signtool.exe工具的拷贝,这样就可以将签名命令加入makecab.bat文件中,修改后的makecab.bat我将其命名为makecabsigned.bat,内容如下:

makecab.exe   /f   "cab.ddf"
signtool sign -f Apollo.pfx -p 11111111 CSharpActiveX.CAB

 

应用

ActiveX控件用于HTML静态页面,执行于IE浏览器端。需要以<object>标签的形式引入页面文件,然后使用Javascript语言调用它。测试代码如下:

<html>
<head><title>CSharpActiveX测试</title>
</head>
<body>
<object id="cSharpActiveX" classid="clsid:65D8E97F-D3E2-462A-B389-241D7C38C518" codebase="CSharpActiveX.CAB#version=1,0,0" style="display: none;"></object><script type="text/javascript" language="javascript" defer="defer">var activeX = document.getElementById("cSharpActiveX");alert(activeX.GetMacAddress());</script>
</body>
</html>

注意,<object>标签的classid属性值即为MacActiveX类的Guid特性值。

 

部署

ActiveX控件在IE浏览器端的部署会因ActiveX控件是否签名而有所区别。下面就以此分类进行说明。当然,首先需要将test.htm和CSharpActiveX.CAB文件部署到服务器上,假设部署后的访问地址为http://192.168.1.1/test.htm。

一、部署未签名的ActiveX控件

未签名的ActiveX控件不受浏览器端信任,默认是不被允许安装的。需要先将站点添加为可信站点,具体步骤为:依次打开IE“工具->Internet选项”,在“安全”选项卡中,选中“可信站点”,如图11所示:

 

11 Internet安全选项

点击“站点”按钮,打开可信站点管理对话框,将服务器站点添加到可信站点列表中,如图12所示:

 

12可信站点对话框

回到“Internet选项”对话框,点击“自定义级别”选项卡,打开可信站点的安全设置对话框,如图13所示:

 

13可信站点安全设置对话框

确认“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”项设置为“启用”,“下载未签名的ActiveX控件”项设置为“提示”。

IE设置完成后,访问http://192.168.1.1/test.htm测试页面(注意,Windows 7需要“以管理员身份运行”IE方可成功安装ActiveX控件),IE便会提示加载ActiveX控件,如图14所示:

 

14首次访问提示加载ActiveX控件

点击“为此计算机上的所有用户安装此加载项”,IE将弹出安全警告,确认是否要安装该ActiveX控件,如图15所示:

 

15 ActiveX控件安装安全警告

点击“安装”按钮,确认安装该ActiveX控件,待IE状态栏进度条完成,说明控件已安装完成,可以通过查看“卸载或更改程序”项来确认是否安装成功,如图16所示:

 

16确认ActiveX控件成功安装

我们可以从ActiveX控件安装过程看出,浏览器端其实是以静默安装的方式完成对CAB包中的MSI安装文件的安装(有点拗口J)。安装完成后,页面成功调用ActiveX控件,弹出接口调用结果(注意Windows 7需要重启IE,且不能用“以管理员身份运行”方式启动,否则会再次提示安装ActiveX控件,但其实控件已经成功安装了,这个问题很奇怪),效果如图17所示:

 

17成功调用ActiveX控件接口

二、部署已签名的ActiveX控件

因为IE默认允许安装并运行收信任的已签名ActiveX控件,所以通过对ActiveX控件签名,可以有效简化浏览器端的配置工作。你仅需要安装签名所用的证书及其证书链文件(本文源码提供的签名文件所含证书是自签名证书,所以它的证书链就只是它自己)。打开源码CAB目录下的Apollo.cer(与Apollo.pfx文件对应的数字证书文件)代码签名证书文件,如图18所示:

 

18签名证书文件

点击“安装证书”按钮,将该证书安装到“受信任的根证书颁发机构”,如图19所示:

 

19安装代码签名证书

打开IE的“工具->Internet选项”对话框,选择“内容”选项卡,点击“证书”按钮,打开IE证书对话框,确认在“受信任的根证书颁发机构”选项卡中包含刚才导入的代码签名证书,如图20所示:

 

20成功导入代码签名证书

此时,再访问测试页面http://192.168.1.1/test.htm,IE就会提示安装ActiveX控件了,而不再需要将站点添加到可信站点并设置IE选项了。

但是,如果用户不能接受初次安装需要导入代码签名证书及其证书链的方式,怎么办呢?从图20可以看到,Windows其实默认内置了一些权威的CA机构证书,可以向这些机构申请一份代码签名证书及私钥文件来对ActiveX控件签名,这样就可以避免该问题了。但是,向权威的CA机构申请证书是需要付费的,所以需要权衡成本和易用性后,再做出选择。

 

升级

要使C#编写的ActiveX控件支持自动升级,需要做四件事情,即升级ActiveX控件库版本、升级安装项目版本、设置安装项目注册表项版本和升级网页<object>版本。

一、升级ActiveX控件版本

打开ActiveX控件项目的“程序集信息”对话框,升级程序集版本和文件版本,如图21所示:

 

21升级ActiveX控件版本

二、升级安装项目版本

选中安装项目,按F4快捷键打开安装项目的属性窗口,升级安装项目的版本,如图22所示:

 

22升级安装项目版本

注意,此处还有一项关键工作要做,就是设置RemovePreviousVersions属性值为True,这样就会在升级时先自动卸载之前版本的控件。

三、设置安装项目注册表项版本

浏览器端检测ActiveX控件是否需要升级,是通过比对<object>标签的codebase属性值和本地HKEY_CLASSES_ROOT/CLSID/{GUID}/InstalledVersion键值是否相等来判断的。所以,如果要实现自动更新,需要手动添加该注册表项,并在每次升级控件时,相应更改该项键值。

右键点击安装项目,依次选择“视图->注册表”菜单,打开安装项目的注册表编辑界面,并在HKEY_CLASSES_ROOT节点下,建立CLSID/{GUID}/InstalledVersion注册表键路径,如图23所示:

 

23创建注册表键路径

右键点击InstalledVersion键节点,选择“新建->字符串值”菜单,新建一个名称为空(空名称会显示为“(默认值)”),值为当前控件版本号的键值,如图24所示:

 

24添加InstalledVersion默认键值

该步骤有几个地方需要特别说明。首先,{GUID}指的是ActiveX控件类的GUID,对应本文MacActiveX类指定的GUID,且该项需要包括左右花括号;其次,如果该安装项目用于发布多个ActiveX控件(类),需要创建多个{GUID}/InstalledVersion路径;最后,InstalledVersion的默认键值的主次版本号间是用“,”分隔,而不是“.”,后续升级时,需要同步升级该键值版本号。

四、升级网页<object>版本

最后,需要升级网页中的ActiveX对象引用版本号,如下用下划线标识部分:

<object id="csharpActiveX" classid="clsid:65D8E97F-D3E2-462A-B389-241D7C38C518" codebase="CSharpActiveX.CAB#version=1,0,1" style="display: none;"></object>

重新生成安装程序,打CAB包,将升级的页面及ActiveX控件(CAB包)更新到服务器。此时,浏览器端重新访问时,就会提示/自动升级ActiveX控件了。

 

总结

本文是《使用C#开发ActiveX控件》一文的升级版本,从ActiveX控件的开发、发布、应用、部署和升级整个生命周期,系统地介绍了使用C#开发ActiveX控件技术的方方面面,对整个过程中可能遇到的一些技术难点进行了逐一讲解,并对其中涉及的一些知识进行了简单介绍。希望本文能够解答自上一篇文章发布以来众多网友提出的种种问题,帮助大家成功掌握这门技术。

文章转自:使用C#开发ActiveX控件(新)

附件下载:示例源码+本文PDF版本

转载于:https://www.cnblogs.com/go-jzg/p/6444701.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Java测试多线程代码

测试多线程代码是一个艰巨的挑战。 尝试测试并发性时获得的第一个建议是尽可能地在代码中隔离并发问题。 这是一般的设计建议&#xff0c;但在这种情况下甚至更重要。 确保首先正确地对并发构造所包装的逻辑进行单元测试。 否则&#xff0c;您可能会花费很长时间尝试找出一个并…

php pdo mysql query_PHP+MYSQL中使用PDO的query方法

一 代码class"php">PDO连接MySQL数据库IDPDO数据库时间$dbmsmysql; //数据库类型 ,对于开发者来说&#xff0c;使用不同的数据库&#xff0c;只要改这个&#xff0c;不用记住那么多的函数$hostlocalhost; //数据库主机名$dbNamedb_database15; //使用的数据库$use…

java 冒号 正则表达式_Java正则表达式问号冒号的使用

在Java和Javascript中正则表达式字符串前面加上?:表示非捕获型匹配&#xff0c;否则就是捕获型匹配。捕获型括号会将匹配到的内容捕获到一些变量里&#xff0c;这些变量按照捕获型括号的左括号为顺序从1开始编号。为了避免括号太多使编号混乱&#xff0c;也为了避免无用的捕获…

Hibernate中的一对多XML映射

一对多关系指出一个实体的单个实例与另一个实体的多个实例相关联。 换句话说&#xff0c;一个表中的每个记录与另一个表中的多个记录相关联。 让我们看看如何通过XML映射文件在Hibernate中定义这种关系。 1.实体关系图 假设我们已经在数据库中创建了学生表和部门表&#xff0…

camel eip_Apache Camel教程– EIP,路由,组件,测试和其他概念的简介

camel eip公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术&#xff0c;协议和数据格式。 但是&#xff0c;这些应用程序的集成应以标准化的方式建模&#xff0c;有效实现并由自动测试支持。 企业集成模式&#xff08;EIP&#xff09;…

JavaOne和OOW 2015总结

大家好&#xff01; 终于&#xff0c;我回来了一个很棒的JavaOne和OOW2015。在这篇文章中&#xff0c;我想分享我的经验&#xff0c;一些照片和我参加的演讲的摘要。 会议前 我于2015年6月24日星期六乘Copa航空公司CLO-PTY-SFO飞往旧金山。 从哥伦比亚出发&#xff08;大约8小…

Marin说PCB之 PCB封装和原理图封装的藕断丝连--续集(2)

最近天气越来越冷了&#xff0c;小编我在上海漂泊的十多年了&#xff0c;感觉今年似乎是最冷的一年啊。家里的秋裤都不管用了&#xff0c;要换成大棉裤和军大衣啊。而且现在羽绒服大部分都很贵&#xff0c;动不动上千元了&#xff0c;都赶得上小编我几个月的私房钱了都&#xf…

调整线程池的重要性

无论您是否知道&#xff0c;您的Java Web应用程序很可能都使用线程池来处理传入的请求。 这是许多人忽略的实现细节&#xff0c;但是迟早您需要了解如何使用该池以及如何为您的应用程序正确调整池。 本文旨在说明线程模型&#xff0c;什么是线程池以及正确配置线程池所需执行的…

在线原理图绘制网站推荐

如今专业EDA软件已经基本在硬件公司普及并正版化&#xff0c;优秀的EDA工具包括 Cadence公司的OrCAD、Allegro软件&#xff0c;Mentor Graphics的PADS&#xff0c; Altium公司的Altium Designer等等&#xff0c;但是它们在功能异常强大的同时也在一些时候显得非常复杂&#xff…

java map与set的区别_java 集合(list,set,map)三者之间的关系和区别

原java 集合(list&#xff0c;set&#xff0c;map)三者之间的关系和区别一&#xff1a;先上一张关系图&#xff0c;让大家看的更明白。备注&#xff1a;其中红色部分为实现&#xff0c;其他地方均为接口。二&#xff1a;各自的特点。List 有序,可重复ArrayList优点: 底层数据结…

adf时间作用域_ADF任务流:页面片段的托管bean作用域

adf时间作用域介绍 当我们使用ADF任务流并需要实现一些特定于流的业务逻辑或存储一些与流相关的信息时&#xff0c;我们通常使用pageFlowScope托管bean。 而且&#xff0c;当我们需要为流的活动&#xff08;页面或页面片段&#xff09;提供服务时&#xff0c;我们会为此类托管b…

IMA文件如何打开,winimage使用方

一般先用UltraISO打开一个系统的镜像文件&#xff08;.iso&#xff09;。其中有些文件&#xff08;尤其是.ima,img&#xff09;比如下面雨林木风Ghost系统盘的这个IMA文件&#xff0c;我们先提取到桌面 用WinImage打开这个文件即可发现这个IMA文件整合了很多东西。所以&#x…

Java的几何布朗运动

Wiener过程是连续时间随机过程&#xff0c;以纪念Norbert Wiener命名。 通常用于用随机成分表示噪音或财务状况。 可以计算几何布朗运动以可视化某些界限&#xff08;以分位数表示&#xff09;以暗示绝对范围。 为了进行计算&#xff0c;需要以下参数&#xff1a; &#xff0…

mongodb java id 查询数据_java 用 _id 查找 MongoDB 下的数据

找网上的资料看了下增删改查&#xff0c;等日后补上。已经实现了数据的插入&#xff0c;现在想通过 _id属性来查找数据。一开始看到 类似 55b321df715cc162076eb466 这么一长串的内容觉得是string类型。但是发现并不能搜索到结果&#xff0c;在网上搜到了解决方案&#xff1a;S…

java maven部署_eclipse中maven项目部署到tomcat

下面就一一介绍这几种部署方式&#xff1a;1.打war包到tomcat/webapps目录这种方式其实跟非maven项目没什么区别&#xff0c;就是打包的方式不同之后在target目录下会生成war包&#xff0c;复制到tomcat/webapps目录即完成部署。2.使用tomcat-maven插件&#xff0c;在pom.xml的…

word 论文排版 —— 按指定格式章节的自动编号

在word中如何实现章节标题自动编号 标题样式与标题的编号是两个步骤&#xff0c;为标题建立编号是在为标题样式确定的基础后进行的。这是显而易见的&#xff0c;也即只有先定义了多级标题&#xff08;也可使用 word 自带的标题样式&#xff09;&#xff0c;才可为这些多级标题自…

北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?

作者&#xff1a;知乎用户链接&#xff1a;https://www.zhihu.com/question/21092045/answer/17164418来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。反对目前的两个不靠谱回答&#xff01;需要的卫星数目和别人占坑没有…

sharesdk短信验证码的集成

在ShareSDK官网http://mob.com/注册并创建Android应用.申请APP_key,下载SDK等 根据官网开发文档导入SDK,目录结构如下 将以上文件按需放入Android Studio项目所要使用SMSSDK的Module所在的Libs里面&#xff0c;再在Module的build.gradle里面将libs加入仓库&#xff08;reposito…

java四神兽_SpringCloud五大神兽之Eureka

注册中心概述什么是注册中心&#xff1f;相当于服务之间的‘通讯录’&#xff0c;记录了服务和服务地址之间的映射关系。在分布式架构中服务会注册到这里。当服务需要调用其他服务时&#xff0c;就在注册中心找到其他服务的地址&#xff0c;进行调用注册中心的主要作用&#xf…

windows下dubbo-admin和zookeeper安装部署

1. 概述 ZooKeeper是Hadoop的正式子项目&#xff0c;它是一个针对大型分布式系统的可靠协调系统&#xff0c;提供的功能包括&#xff1a;配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务&#xff0c;将简单易用的接口和性能高效、…