1

我有一个调用 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
4

2 回答 2

0

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

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

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

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

于 2013-07-18T17:39:14.163 回答
0

我实际上找到了解决方法。它看起来确实像一个 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");
    }
于 2013-07-23T19:51:54.493 回答