从C#程序集调用PowerBuilder.NET程序集始终返回空字符串或空字符串

时间:2013-07-12 21:17:20

标签: c# assemblies powerbuilder powerbuilder.net

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

当C#中的Window调用PB.NET程序集时,它返回预期的结果“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

2 个答案:

答案 0 :(得分:0)

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

我要看的另一件事是.NET Assembly Target Properties中的'use dot net nullable types'设置 - 另一个猜测。这是Sybase的文档。

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

我认为它与数据对象没有内置到程序集中有关,因为你将它描述为从不有任何行。

答案 1 :(得分:0)

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

我发现规则有一个例外。 PowerBuilder.NET程序集可由C#程序集调用,如果它首先由同一应用程序中的Window或Service调用。我想这是因为对象在第一次调用后仍然在内存中并从那里重用。

幸运的是,我的应用程序包含一个Service,它启动C#程序集中包含的多个线程。我将此调用添加到我的服务的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");
    }