【问题标题】:Why does "embed interop types" need to be set to false for SAPbobsCOM.dll in SAP b1 project?为什么 SAP b1 项目中 SAPbobsCOM.dll 的“嵌入互操作类型”需要设置为 false?
【发布时间】:2018-03-21 19:11:59
【问题描述】:

在我的第一个 SAP B1 项目中,我将 SAPbobsCom.dll 的 Embed Interop Types 设置为 True。这是一个“DI API”插件项目,即不需要从 SAP B1 内部运行插件。我创建的代码编译得很好,我认为我还可以。

但是,出现了一个新要求,即它必须在 SAP B1 中运行。长话短说,我意识到为了打包 SAP b1 工具所需的插件,我将 Embed Interop Types 设置为 False。

然后我在 SAP 论坛中发现了一些文章,表明建议将互操作类型设置为 false,否则会“导致问题”。但是没有解释为什么,或者会出现什么问题。我想知道这是否是特定于 SAP 类、COM 或其他东西的问题。为什么该设置会改变类的行为方式?

当我尝试重新编译插件并将 Embed Interop Types 设置为 False 时,许多使用 SAPbobsCOM 类的语句都失败了。错误的形式为:无法将类型“xyz”隐式转换为“abc”。存在显式转换(您是否缺少演员表?)

例如,为了得到语句:

objRecSetDN = SapObjects.oCompany.GetBusinessObject(BoObjectTypes.BoRecordset)

要编译,我必须将其更改为:

objRecSetDN = (SAPbobsCOM.Recordset)SapObjects.oCompany.GetBusinessObject(BoObjectTypes.BoRecordset)

我不得不改变:

string CheckSend = RS.Fields.Item("U_Send").Value;

到:

string CheckSend = (string)RS.Fields.Item("U_Send").Value;

【问题讨论】:

  • 感谢 Marvin Fischer 的编辑建议。我是 StackOverflow 的新手。

标签: c# casting com interop sap


【解决方案1】:

我多年来一直在制作 SAP B1 插件,从未将 Embed Interop Types 设置为 false。我不认为你必须这样做。这适用于使用 .ard 文件添加的插件和在 B1 之外运行的程​​序。 这也适用于SAPbouiCom.dll

我使用 B1DESetup_B192 工具在 Visual Studio 中打包我的插件,并且没有您上面所说的这样的要求。见下图。

【讨论】:

  • 什么版本的 SAP b1 和什么版本的 SAPbobsCOm.dll?
  • 当您编写引用 SAPbobsCOM 类的语句时,您是否总是像我给出的示例中那样显式转换结果,例如:objRecSetDN = (SAPbobsCOM.Recordset)SapObjects.oCompany.GetBusinessObject(BoObjectTypes.BoRecordset)
  • 是的,我总是这样做
  • 我认为问题在于,如果 Embed Interop Types 设置为 True,那么您不必“必须”编写显式强制转换,但如果您愿意,可以。但是如果 Interop 设置为 false 那么您必须进行显式转换,否则它将无法编译。所以我认为,因为您正在编写显式转换,所以无论哪种方式,您都没有遇到问题。我的问题不仅在于它是否需要,还在于 COM 以及为什么该设置会改变类的行为方式。
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
相关资源
最近更新 更多