【问题标题】:Calling PowerBuilder.NET Assembly From a C# Assembly Always Returns Null or Empty String从 C# 程序集调用 PowerBuilder.NET 程序集总是返回 Null 或空字符串
【发布时间】:2013-07-12 21:17:19
【问题描述】:

我有一个调用 PowerBuilder.NET(12.1 Build 7217) 程序集的 C# 程序集。 PowerBuilder 源代码包含在下面,您可以看到它是一个相当简单的对字符串的真/假评估。

当 PB.NET 程序集被 C# 中的 Window 调用时,它返回“true”的预期结果。当 C# 程序集调用相同的代码时,该代码返回 "" 或空字符串。

我已设法将问题缩小到 PB.NET 程序集中的 DataStore 交互。如果从另一个程序集调用 PB.NET 程序集,则 DataStore 始终有 0 行并且只包含空字符串。有没有人见过或处理过这个问题?

// Create instance of Datastore
ldsExpression = CREATE DataStore

// Set data object
ldsExpression.DataObject = "d_condition_expression"

//// Setting datawindow expression
lsExpression = 'condition_expression.expression = ~"' + asConditionExpression + '~"'

//// Apply Expression
lsError = ldsExpression.Modify(lsExpression)

IF len(lsError) = 0 THEN
    ldsExpression.InsertRow(0)

    //get the result
    lsResult = ldsExpression.GetItemString(1,"condition_expression") 
ELSE
    lsResult = lsError
END IF

// Destroy instance of ldsExpression
DESTROY(ldsExpression)

RETURN lsResult

【问题讨论】:

    标签: c# assemblies powerbuilder powerbuilder.net


    【解决方案1】:

    我看到您正在动态分配一个数据对象,我想知道它是否包含在最终程序集中——这只是一个猜测。这类似于过去在标准 PB 程序中编译为 PBD 但未在 PBR 文件中添加动态分配的数据对象时出现的问题。

    我要看的另一件事是 .NET 程序集目标属性中的“使用 dot net 可空类型”设置——另一种猜测。这是来自 Sybase 的文档。

    http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.help.pb.12.5/title.htm

    我认为这与未将数据对象构建到程序集中有关,因为您将其描述为从未有任何行。

    【讨论】:

    • 数据对象包含在 PowerBuilder 程序集中。问题是它不能被另一个程序集调用(我需要为我的应用程序做这件事)。 PowerBuilder.NET 程序集似乎只能由 Window 或 Windows Service 调用。一旦我在 Visual Studio 中将输出类型更改为库,对 PB.NET 的调用就不再起作用了。我发布了我在下面找到的解决方法。
    【解决方案2】:

    我实际上找到了解决方法。它看起来确实像一个 PowerBuilder.NET 错误,应该在未来的版本中解决。调用 PowerBuilder.NET 程序集在由 Window 或 Service 调用时有效,但在由常规 DLL 程序集调用时无效。

    我发现规则有一个例外。如果 PowerBuilder.NET 程序集首先由同一应用程序中的窗口或服务调用,则它可以由 C# 程序集调用。我认为这是因为该对象在第一次调用后仍保留在内存中并从那里得到重用。

    幸运的是,我的应用程序包含一个启动 C# 程序集中包含的多个线程的服务。我将此调用添加到我的 Service 的 Main 方法中,随后对 EvaluateExpression 的所有调用都可以正常工作,无论它们是从哪里调用的。

    这里是我关于这个问题的 Sybase/SAP 线程的链接。 http://scn.sap.com/thread/3391198

        private static string Evaluate(string expression)
        {
            var blah = new PowerBuilderAssembly();
    
            return blah.EvaluateExpression(expression);
        }
    
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
    
            var result = Evaluate("1 = 1");
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多