我有一个由扩展Contact表的第三方开发的自定义项目。 我可以访问自定义项目并在Acumatica的自定义项目界面中查看DAC定义“ContactExt.UsrField1”。
但是,我在Visual Studio项目中使用“ContactExt”类时遇到问题。我似乎找不到引用它的方法来使用PXCache<> .GetExtension()方法。
答案 0 :(得分:0)
Acumatica项目编辑器中添加的自定义DAC字段在运行时而非静态时间解析,至少达到6.1.x版。
这样做的副作用是Visual Studio无法确定其静态类型,因此会在静态分析和编译过程中将它们加下划线并报告错误。
当IIS编译Acumatica自定义时,它会将它们放在运行时代码DLL中。如果将调试器附加到网站IIS实例(w3wp.exe),则可以看到引用的运行时代码DLL:
从技术上讲,您可以将此DLL静态链接到项目,并且VS静态分析器将静态显示DAC类型。这将允许您使用运行时代码DLL作为静态引用来使用VS项目中的其他自定义字段并进行编译而不会出现错误。您也可以在VS项目中动态链接该DLL,但两者都是错误的解决方案,因为它会锁定DLL文件并阻止IIS重新编译它。运行时代码DLL也是临时的,当由IIS重新编译时,它将在文件名后附加一个不同的UID,使其不适合静态链接,并且不适用于动态链接。
每次IIS重置或在Acumatica' App_RuntimeCode'中更改源文件代码时,IIS都会重新编译运行时代码DLL。夹。 App_RuntimeCode是Acumatica项目编辑器中显示的源代码所在的文件夹。这是一个用于运行时编译的IIS特殊文件夹。鉴于这些限制,我建议两种方法在运行时自定义和DLL自定义之间共享数据类型:
如果您可以修改运行时自定义,请创建包含共享数据类型的共享DLL,并在两个自定义项中引用它。
如果您无法修改运行时自定义,则必须将所有引用共享数据类型的代码放在运行时自定义中(使用App_RuntimeCode中的Acumatica项目编辑器)。不引用共享数据类型的代码也可以放在DLL中并添加到相同的自定义项目文件中。这将是一种结合运行时和静态编译代码的混合方法。