2013-07-12 12 views
1

PowerBuilder.NET (12.1 Build 7217) 어셈블리를 호출하는 C# 어셈블리가 있습니다. PowerBuilder 소스 코드는 아래에 포함되어 있습니다. 문자열의 오히려 단순한 참/거짓 평가라는 것을 알 수 있습니다.PowerBuilder.NET 어셈블리 호출 C# 어셈블리에서 항상 Null 또는 빈 문자열을 반환합니다.

PB.NET 어셈블리가 C#의 창에 의해 호출되면 예상 결과 "true"를 반환합니다. 동일한 코드가 C# 어셈블리에서 호출되면 코드는 ""을 반환하거나 빈 문자열을 반환합니다.

PB.NET 어셈블리의 데이터 저장소 상호 작용에 이르기까지 문제를 좁힐 수있었습니다. 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

난 당신이 동적 데이터 객체를 할당하고, 나는이 그냥 추측 assembly--가 마지막에 포함되고 있는지 궁금 참조하십시오. 이는 PBD로 컴파일 할 때 표준 PB 프로그램에서 발생했지만 PBR 파일에서 동적으로 할당 된 데이터 객체를 추가하지 않을 때 발생했던 문제와 유사합니다.

내가보고 싶은데 또 다른 것은 여기. 사용 .NET 어셈블리 대상 Properties-- 또 다른 추측을 설정 순 nullable 형식을 '점'이다 사이베이스의 설명서입니다.

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

나는 생각한다 당신이 결코 행을 가지지 않는다고 설명 할 때 어셈블리에 내장되지 않은 데이터 객체와 관련이 있습니다.

+0

데이터 객체는 파워 빌더 어셈블리에 포함된다. 문제는 다른 어셈블리에서 호출 할 수 없다는 것입니다 (응용 프로그램에서 수행해야하는). PowerBuilder.NET 어셈블리는 Windows 또는 Windows 서비스에 의해서만 호출 할 수 있습니다. Visual Studio에서 Output Type을 Library로 변경하면 PB.NET에 대한 호출이 더 이상 작동하지 않습니다. 아래에서 찾은 해결 방법을 게시했습니다. –

0

실제로이 문제를 해결할 수있는 방법을 찾았습니다. 실제로 PowerBuilder.NET 버그처럼 보입니다. PowerBuilder.NET 어셈블리 호출은 호출 될 때 작동합니다. 창이나 서비스에 의해 생성되지만 일반 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"); 
    }