得到运行Sap登录vb6的GuiApplication到c#

时间:2012-12-05 18:03:23

标签: c# vb6 sap

我必须将vb6程序迁移到C#.net 3.5 用户启动SAP登录并进行身份验证, 然后他可以使用该工具使用该工具获取和插入数据 问题: 我可以使用反射创建一个新的GuiApplication,但我无法用它来获取当前打开的GuiSessions:/ 这是当前打开的GuiApplication与所有已打开的GuiSessions的代码的vb6部分

Dim obj As Object
    Set obj = CreateObject("SAPGUI")
    Set obj = obj.GetScriptingEngine

    If TypeName(obj) = "GuiApplication" Then
        Set SapAutomationObject = obj
        SapAutomationObject.AllowSystemMessages = False

        Debug.Print "SAP Automation OK"
    End If

我试着反思:

 GuiApplication Application = (GuiApplication)System.Activator.CreateInstance(Type.GetTypeFromProgID("SapGui.S‌​criptingCtrl.1"));

我有一个实例但没有现有的会话

5 个答案:

答案 0 :(得分:7)

public static void testConnection()
        {
            SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper();
            object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI");
            object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod,
                null, SapGuilRot, null);
            SAPconnection.sapGuiApp = engine as GuiApplication;
            GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection;
            GuiSession session = connection.Children.ElementAt(0) as GuiSession;
            MessageBox.Show(session.Info.User + " !!||!! " + session.Info.Transaction);


        }

使用此方法,您必须引用SAP安装的sapgui文件夹中的SapROTWr.DLL。

答案 1 :(得分:2)

这对我有用(SAP 730 / Win7):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SAPFEWSELib;
using SapROTWr;

namespace FIT.SapHelper
{
    public static class stcSapHelper
    {
        public static void testConnection()
        {
            SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper();
            object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI");
            object engine = SapGuilRot.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null);
            GuiConnection connection = (engine as GuiApplication).OpenConnection("BOX DESCRIPTION");
            GuiSession session = connection.Children.ElementAt(0) as GuiSession;
        }
    }
}

答案 2 :(得分:1)

假设SAPGUI是一个COM对象,那么您应该能够对其进行引用并将其创建为新对象而不使用反射。即使最初的VB6代码使用'后期绑定'

,使用早期绑定而不是后期绑定

其次,假设后期绑定,Type.GetTypeFromProgID("SapGui.S‌criptingCtrl.1")片段不应该Type.GetTypeFromProgID("SapGui")与原始VB6匹配吗?您可能需要检查SAPGUI的对象模型,以确保引用正确的对象。

答案 3 :(得分:0)

我发现使用正在运行的会话的唯一解决方案是将该代码加载到dll中并通过c#

访问它

答案 4 :(得分:0)

SAP发布了SAP .NET连接器,以提供从.NET应用程序内部与SAP系统交互的标准方式。查看http://service.sap.com/connectors,您必须是SAP合作伙伴才能访问该页面