P/Invoke
场景:c#调用c/c++函数库
特别说明:CLR公共语言运行库中提供的调用本机代码函数库的办法称为P/Invoke
平台:windows和linux,.net framework和mono都实现了P/Invoke,提供了配套的关键字和特性类
本机调试:可以在c#和c代码之间无缝衔接,设置方法:项目属性->>调试->>启用本机调试
c/c++函数转c#方法签名的参考资料:https://www.pinvoke.net/
cppsharper
场景:c#调用c/c++函数库
开源项目https://github.com/mono/CppSharp,包装c/c++函数库给c#调用
COM互操作
.net framework提供了配套的特性类和工具,.net调用
创建普通类库项目
修改程序集元数据信息:[assembly: ComVisible(true)]
需要导出的class增加相关特性
注册程序集为com组件,因为excel严格区分32、64位版本,,只能加载对应版本注册的com组件
64位: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe 程序集完整路径 /codebase
32位:C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe 程序集完整路径 /codebase
加载com组件
启动Excel,菜单:开发工具->>加载项->>自动化->>导出的class
本质是走office提供的c++扩展接口,利用互操作,c++扩展接口→dna提供的xll适配器→.net程序集
具体参看项目中的README.md文件
vba语法
System.Windows.Interop.MSG :对应win32的窗体消息数据结构
System.Windows.Forms.UnsafeNativeMethods:非公开的类,但是包含大量win32的方法,需要调用kernel32,user32等里面的方法可以来这里面参考
A项目的项目文件不做改动
B项目的项目文件进行修改,找到节点PropertyGroup,然后 增加一条信息
<SilverlightApplicationList>{22E9E578-62FE-4CF0-83C7-6F27FA2B67A8}|..\HttpFileClient\HttpFileClient.csproj|silverlight|False</SilverlightApplicationList>
关联后的效果就是:A项目编译后,会生成一个xap文件到B项目的silverlight目录下,
或者是:B项目编译的时候,会去编译A项目并且得到xap文件放到silverlight目录下
这个本质是msbuild执行项目的编译target,某个target中有命令让msbuild执行了这个操作,具体哪个target待研究
客户端浏览器只需要装runtime即可,并且版本越高越好
开发机需要装:
silverlight sdk(runtime+msbuild的编译配置)
silverlight developer(vs集成,项目模板)
silverlight toolkits(官方额外组件库)
特别说明:silverlight sdk已经包含runtime,不需要重复安装
特别注意:如果开发机装了runtime,并且版本和sdk中的runtime版本不一致,会导致无法调试
所以开发机sdk版本低一点没关系,客户端的runtime版本高就行,这样客户端一定可以正常执行sdk打包出来的xap包
开发环境使用localhost访问,只需要项目属性中勾上【在浏览器内运行时需要提升的信任】即可,
背后:vs增加了一个InBrowserSetting.xml的配置文件,编译的时候会打包到xap文件
用户环境下,还需要对xap进行签名,然后客户电脑安装xap签名证书的公钥并且添加到信任证书