我有一个调用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
答案 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");
}