在.NET Interop from X++一文中有提到X++可以引用的.NET程序集,这里就这个问题更加深入的探讨。

前文中说到X++所引用的.NET程序集需要手工拷贝到Client\bin目录下,如果程序集已经发布到GAC,这步不是必须的,因为AX首先在GAC中搜索程序集,然后是server

\bin或者client\bin目录。接下来还需要在AOT->Reference下添加对该程序集的引用,在“Add reference”窗口上“Browse”选择要添加的程序集文件,默认目录就是client\bin,如果你选择一个这个目录之外的.dll,AX会提示文件不在client\bin目录下,要么拷贝到这个目录,要么发布到GAC,虽然你可以点“是”,在AOT->Reference下也能看到添加的程序集命名空间,但实际上是不会被正确装载的,写代码的时候也找不到这个程序集命名空间,所以老老实实把.dll拷贝到client\bin目录下吧。按照MSDN的说法是在把程序集添加到AOT->Reference的时候,AOS会自动把.dll程序集文件从本地计算机拷贝到AOS的server\bin目录下,但是在我的测试中却没有看到,不知道是不是因为我的client和AOS是同一台电脑的关系,至少在我的测试中没有发现这点。MSDN还提到这种拷贝是从client到服务器单方向的,如果其他的client计算机需要这个程序集是不能从AOS获取的,只能手工拷贝发布了。测试中发现一个有趣的问题是在把程序集添加到AOT->Reference后,写好我们的代码来引用程序集种的某个类,然后回到AOT->Reference删除这个程序集的引用,发现只要.dll还在client\bin目录下,原来的程序都能正确运行,即使把client关掉再打开也是一样能正确运行,甚至代码智能提示中也能看到相应的程序集命名空间,但是如果再往client\bin目录下拷贝点文件,重新打开client就会发现提示找不到所引用的程序集空间,怀疑AX监视这个目录的变化,在目录发生变化时再刷新AOT->Reference,只是猜测,未加证实。

那么如果一个.dll程序集需要在多个Client使用,有更方便的办法吗?我们可以把Class library的Project在Visual studio中添加AOT,这个动作会将工程文件及输出的.dll文件保存到AOS数据库,按照MSDN的说法是只要后续server有进程需要这个程序集,就会拷贝.dll到server\bin\VSAssemblies\目录下,我的client开发机和AOS在一台电脑上,不知道所谓的“有进程需要”是指什么时候?我的做法是选择Class libarary的工程,属性中Deploy to server选择Yes,部署一下就能在server\bin\VSAssemblies\目录下看到.dll了,只有这样我才能在代码智能提示中找到相应的程序集命名空间。不需要设置Class libary工程的Deploy to client属性为Yes,在我的测试中发现在“C:\Users\<User name>\AppData\Local\Microsoft\Dynamics Ax\VSAssemblies”目录下自动生成了这个.dll文件,这个应该是从AOS自动到Client的部署了。如果你在代码编辑窗口中没有找到相应的程序集命名空间,你可能需要重启下AOS。

回到这样一个问题,如果对添加到AOT的Class libary做了更改编译,要使用新的程序集你可能需要重启AOS,要中断其他用户的正常操作显然是不合适的。我们知道CLR程序集是宿主在AppDomain中的,而CLR的AppDomain是可以动态卸载的,AX正好利用了这一点来实现所谓的程序集“Hot-Swapping”,默认情况下这个功能没有开启,所有的客户端连接共享一个CLR AppDomain,要使用新版本的程序集,就需要重启AOS来重建AppDomain,而启用这个功能后,会为每一个Client提供一个单独的AppDomain,这样只需要关闭Client重新打开一个就完成了AppDomain的刷新。开启这个功能很简单,在“Microsoft Dynamics AX 2012 Server Configuration”配置工具中激活“Allow hot swapping of assemblies when the server is running”功能就可以了,但是不建议在生产环境中开启这个功能,因为为每一个client提供一个单独的AppDomain会消耗大量的内存资源。

还剩下一个问题是,如果我们只允许在AOS部署程序集,比如因为第三方授权的原因,安全的原因,这种情况下我们不能把程序集拷贝到Client来开发,因而无法获知相应CLR类型的方法、属性等等。这时候可以使用X++的CLRObject类,我们不需要在编译时就知道其实际CLR类型的方法,在实际运行的时候再做动态后绑定,它的用法是这样的:

static void ClrObjectXppJob(Args _args)
{str sExcepMesg;CLRObject clrObj2;clrObj2 = new CLRObject("System.ApplicationException","Testing CLRObject 52." // This one parameter matches a constructor signature.
        );sExcepMesg = clrObj2.get_Message(); // Calls the Message property by its CIL name.
    info(sExcepMesg);
}

更多有关AX下.NET的部署问题可参见http://msdn.microsoft.com/en-us/library/hh538479。

转载于:https://www.cnblogs.com/duanshuiliu/archive/2012/09/13/2683335.html

[AX]AX2012 使用.NET程序集部署相关推荐

  1. 探究.NET的bin引用程序集运行机制看.NET程序集部署原理

    探究.NET的bin引用程序集运行机制 看.NET程序集部署原理 新建一个最简单的网站,并引用使用程序集Nhibernate.dll,页面代码为       运行后输出的结果 .NET 程序集部署程序 ...

  2. [AX]AX2012 SSRS报表使用Report Data Method

    在AX2012的SSRS报表中可以使用c#或者Visual basic .net编写report data method来获取和操作数据,由report data method返回的数据可以用在报表的 ...

  3. [AX]AX2012 纪录缓存

    为了加快对AX表纪录的访问,可以把从数据库读取的纪录缓存在内存中,以减少对数据库的频繁读取提高性能.纪录缓存有两种,一是单条纪录缓存,二是集合缓存. 集合缓存可以在设计时将表的的CacheLookup ...

  4. [AX]AX2012开发新特性-全文索引

    全文索引在索引中识别字符串字段中使用空格隔开的单词,不像普通索引仅仅使用字符串的第一个单词,这样能加快对字符串字段的搜索.AX2012支持每个表有一个且只能有一个全文索引,索引可以包含多个字段,对字段 ...

  5. [AX]AX2012 AIF(二):文档服务编程模型

    一个完整的文档服务包含很多对象,以Customer服务为例,它包含以下对象: 查询AxdCustomer:这个query的顶层表为CustTable,其下Datasource包含表DirParty,D ...

  6. [AX]AX2012 C#使用IIS宿主AIF服务的一些问题

    AIF的服务可以是宿主在AOS,使用NetTcp适配器:也可以是宿主在IIS,使用HTTP适配器,两种方式都可以在C#工程中添加Service reference来调用这些服务.配置及使用NetTcp ...

  7. [AX]AX2012 R2 出差申请和支出报告

    AX2012中有个模块叫做出差和支出,用于管理出差以及相关的费用,用户只能在员工自助服务EP站点上提交出差申请.费用报销报告,在Client程序中做审核以及后续的支付动作等,最后形成相关的财务分录. ...

  8. 手工部署Sqlserver CLR程序集

    以前一直用VS部署Sqlserver CLR程序集简单省事,现在服务器部署在内网了,必须手动更新部署Sqlserver CLR程序集.     开始以为ALTER ASSEMBLY [程序集名称] F ...

  9. Assembly Essence-- 程序集深入探讨:程序集结构及部署

    1. Assembly definition     Assembly简单来说,就是一个以CLR为宿主.版本化的.自描述的二进制文件.需要注意的是,.Net framework里面的Assembly虽 ...

最新文章

  1. 机器人瓦力船长机器人_警察“瓦力”来啦!机器人巡逻南京路 这样的它你喜欢吗?...
  2. html完整表格结构,正确认识html表格(table)的结构
  3. 0经验跨行,我怎么拿到谷歌offer的?
  4. /scriptalert(/xss/)/script
  5. dav1d 0.5.1:更快!
  6. 电压kV为什么k要小写,原因你知道吗?
  7. .NET Core 如何生成信用卡卡号
  8. Command 模式 Step by Step
  9. idea 修改样式要编译_在IDEA中DEBUG Javac源码
  10. python 基础学习--运算符集合
  11. 1秒后跳转页面(延时setTimeout)
  12. UVa12545 - Bits Equalizer
  13. 6713芯片手册_tms320c6713 gpio_tms320c6713_dsp6713中文手册
  14. 智慧医院绩效管理方案
  15. 柱状图、直方图、散点图、饼图讲解
  16. 题解 - [POI2008]KUP-Plot purchase
  17. python 异常学习1
  18. HD44780http://blog.sina.com.cn/s/blog_61b6e08b01016xif.html
  19. 基于web的家庭理财系统
  20. 谈谈企业信息化 一种比较简单、灵活的产品物料多单位实现方案

热门文章

  1. ffmpeg播发器(H265)
  2. Python中相见恨晚的技巧
  3. java 重启系统_java 程序,实现重启功能。求大神帮忙,急
  4. Linux其实没那么难学
  5. 手把手教你 Socket 通信(TCP/IP)
  6. 单片机从事什么工作?只会51单片机能找到工作吗?
  7. poj2449(k短路算法)
  8. Balkan2007]Toponyms[链式前向星建字典树+getchar()读入优化]
  9. java二叉树镜像_给定一个二叉树,检查它是否是镜像对称的。
  10. 封装成vla函数_不知道怎么封装代码?看看这几种设计模式吧!