[AX]AX2012 使用.NET程序集部署

.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值