我有一个调用PowerBuilder.NET(12.1 Build 7217)程序集的C#程序集。PowerBuilder源代码包含在下面,您可以看到它是一个相当简单的字符串真假评估。
当C#中的窗口调用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发布于 2013-07-19 01:39:14
我看到您正在动态分配一个数据对象,我想知道它是否包含在最终程序集中--这只是一个猜测。这类似于在标准PB程序中编译为PBD但不在PBR文件中添加动态分配的数据对象时出现的问题。
我要看的另一件事是.NET程序集目标属性中的“使用.Net可空类型”设置--这是另一种猜测。
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.help.pb.12.5/title.htm
我认为这与数据对象没有内置到程序集中有关,正如您所描述的那样,它从来没有任何行。
发布于 2013-07-24 03:51:54
我真的找到了解决这个问题的办法。它看起来确实像是一个PowerBuilder.NET错误,应该在未来的版本中解决。当由窗口或服务调用时,调用PowerBuilder.NET程序集正常工作,但如果由常规DLL程序集调用,则不起作用。
我发现了规则中的一个例外。如果PowerBuilder.NET程序集首先由同一应用程序中的窗口或服务调用,则C#程序集可以调用该程序集。我认为这是因为对象在第一次调用后仍然留在内存中,并从那里被重用。
幸运的是,我的应用程序由一个服务组成,该服务启动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");
}https://stackoverflow.com/questions/17624140
复制相似问题