我无法找到与此相关的问题,或者我太傻了,无法理解其他解决方案可能已应用于此。在这里。
我试图创建一个DLL,该DLL应该只包含其他程序员可以在其项目中引用的一个函数,以便使用该函数。该函数只是获取一个已经运行的对象并将其返回给调用者。它是一个使SAP对象运行并返回它的函数。
下面的DLL代码
using System;
using SAPFEWSELib;
using SapROTWr;
namespace SAPCon
{
public class SAPObj
{
public static GuiSession CreateNewSession()
{
SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper();
object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI");
object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null);
GuiApplication sapGuiApp = engine as GuiApplication;
GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection;
GuiSession session = connection.Children.ElementAt(0) as GuiSession;
int c = (connection.Children as GuiComponentCollection).Count;
session.CreateSession();
int err = new int();
int ses = new int();
do
{
try
{
session = connection.Children.ElementAt(c) as GuiSession;
ses = session.Info.SessionNumber;
err = 0;
}
catch (Exception e)
{
err = e.HResult;
}
} while (err == 614);
return session;
}
}
}
以下是试图测试dll的程序代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SAPFEWSELib;
using SapROTWr;
using SAPCon;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
GuiSession g;
g = SAPCon.SAPObj.CreateNewSession();
int s;
s = g.Info.SessionNumber;
Console.WriteLine(s);
Console.ReadKey();
}
}
}
如果我将整个DLL代码放在常规控制台应用程序中,它可以完美地工作,但是当我引用dll并尝试使用该函数时,我在第一行获得了一个异常 SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr。 CSapROTWrapper(); 表示该类未注册。
我认为我的DLL有问题,而不是SAP Dlls,因为它们从应用程序运行时工作正常。我在我的dll上做了一个诅咒32位并且它没问题,我尝试了一个regsvr,但它无法找到入口点。
我在这里缺少什么?
答案 0 :(得分:1)
在这种情况下,您可能想要检查的几件事情是:
[STAThreadAttribute]
应用于相关方法是否解决了问题