如何从 Java 中的 C# dll 调用函数?

Posted

技术标签:

【中文标题】如何从 Java 中的 C# dll 调用函数?【英文标题】:How to call Function from an C# dll in Java? 【发布时间】:2017-12-15 08:02:29 【问题描述】:

我有一个 SAP-DLL 来启用编程接口和 SAP 程序之间的通信。

我有以下 c# 示例代码与 dll 文件相结合:

var loggerService = LoggerService.GetLoggerService("FileLogger");
var itasProxy = SapProxyFactory.CreateSapProxy(SapSystem.Example, loggerService, "Example_User", StringExtension.CreateSecureString("Example_Password")); 
var funcResult = sapProxy.SearchSapAddress(clientNo);

if (funcResult.Successfull)

    funcResult.ReturnValue = withFormatting
        ? AddressFormatter.SplitStreetHouseNo(funcResult.ReturnValue)
        : funcResult.ReturnValue;

现在我希望将相同的功能转移到 java。我完全不知道该怎么做。我尝试了以下使用 Loggerservice 作为启动器,但它不起作用:

public class SAPConnector 

    public static void main(String[] args) 
        // TODO Auto-generated method stub
        connectSAP();
    
    public void connectSAP()
    
        System.load("C://Temp//SapConnector.dll");
        Object loggerService = getLoggerService("FileLogger");
    
    public native Object getLoggerService(String lcLogger);

我只需要一些如何从 dll 调用函数的信息,或者如何将 C# 代码转换为 Java 中的工作代码的示例。

您好,

凯文

【问题讨论】:

@john:不,您发布的主题不是基于完全不同的 dll 问题 好的,我会删除我重复的建议。但是,您正在寻找一种从 Java 调用 C# 代码的方法,不是吗?如果不是这种情况,您应该重新提出您的问题。 我看不出这两个 sn-ps 有什么共同点。在我看来,它们完全不同。无论如何,当您写“不起作用”时,这是什么意思?向exactlx 展示您尝试过的内容以及这样做时遇到的问题。这包括您当前的 cide 以及您获得的每个错误/异常/意外行为/意外结果。 是的,我是,但你必须阅读我的文字。这是一个特殊情况,我已经尝试了一些我在 *** 上阅读的内容,但没有任何效果,因为我无法获得本机支持的正确语法。我的 dll 使用它自己的类和数据类型,我不知道如何让 java 识别这些函数和数据类型,我只需要我发布的代码中的一个示例,以便我可以找到解决方案 @HimBromBeere 与我现在拥有的代码我在我的 java 代码的第 10 行收到错误 UnsatisfiedClassLink ......就像我说的那样,第一个 sn-p 是工作的 c# 代码组合使用 dll,现在我需要具有相同功能的相同代码才能在 java 中工作:) 【参考方案1】:

DLL 是 Microsoft 格式。 Java 是跨平台的,因此无法识别特定于操作系统的任何内容,例如 DLL。

一种解决方法是使用JNI (Java Native Interface),但这通常不是一个好的解决方案,因为它使您的程序依赖于平台。

相反,我会从 SAP 中寻找一个 JAR,它提供了类似的接口。 也许是SAP JCO。

你可以看到一些actual code examples using JCO here,还有一些technical information on step-by-step download and configure here。

【讨论】:

感谢您的评论,我已经搜索过了,但现在我必须让这个工作......就像你看到的那样,我尝试了 JNI,但我认为我犯了一个错误或忘记了什么,这是我第一次使用它...我想到的另一个解决方案是使用 vbs 编写代码并从 java 调用 vbs 脚本,但这也不是一个好的解决方案... 虽然 Java 是独立于平台的——就像 .NET 一样(参见 ***.com/questions/3656721/is-net-platform-independent)——这并不意味着每个 java 代码都可以在任何操作系统上运行。存在许多仅在 Windows 机器上运行的此类程序。话虽如此,这个 JNI 正是 OP 所需要的,从 JAVA 调用 .NET 程序集绝对没问题。 @HimBromBeere 我的语法好吗?还是我错过了什么让这个工作? 是的,我同意这在很大程度上取决于您的业务场景。不过,如果 SAP 不在 JAR 中提供相同的东西,我会感到非常惊讶。他们比许多其他公司更面向 Java。 @KevinBarz 如果您确实使用 JNI,也许链接中的教程可以帮助您。您是否遵循相同的步骤? @YoavGur 我已经尝试了几件事,这就是我在寻找答案的原因,但我会用你的教程再试一次

以上是关于如何从 Java 中的 C# dll 调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

C#中调用dll,函数参数带指针,如何改写?

如何从 C# 调用具有 void* 回调和对象参数的 C++ Dll 中的函数

如何解决java调dll报Unable to load library的错误

如何将 COLORREF 中的所有数据返回给 C# 中的调用者

C# dll里main函数如何运行

C#项目中如何调用C#写的dll中的资源文件,如 xml文件