使用DLL's从Java用c#编写

本文关键字:Java 编写 DLL 使用 | 更新日期: 2023-09-27 18:18:20

这是我第一次使用DLL,我有点不知所措。

不是因为我不懂代码。但是因为我所遵循的所有教程在某些点上都是错误的。

首先我尝试了这个,但是当javah命令不能工作时,我的工作被缩短了,错误的消息是:Error: Could not find or load main class com.sun.tools.javah.Main

然后我继续制作我自己的ddl,以便我可以从C库调用它们。找到了这个视频,我能够跟随它和它在微软页面上的页面来制作dll。请注意,我完全有能力完成这个示例。我挣扎的一部分是如果我没有头文件或库文件到DLL会发生什么。然后我开始遵循这个例子visual studio说import不存在。

我发现其他人也能做同样的事情。

我做错了什么?最终目标,我想知道如何创建一个像视频中的DLL文件。只有在我拥有DLL文件的情况下,才能访问它的功能。

所以如果DLL是用以下命令创建的:

namespace nmspace
{
    class myclass{
    public:
        static __declspec(dllexport) void Crap();
    };
}

Source.cpp

#include "Header.h"
using namespace std;
#include <iostream>
namespace nmspace
{
    void myclass::Crap(){
        cout << "Some Crap";
    }
}

我如何通过loadlibrary或LoadLibararyA调用它。请注意,这对我不起作用

读取dll:

#include <Windows.h>
#include <iostream>
using namespace std;

void PrintFullPath(char * partialPath)
{
    char full[_MAX_PATH];
    if (_fullpath(full, partialPath, _MAX_PATH) != NULL)
        printf("Full path is: %s'n", full);
    else
        printf("Invalid path'n");
}

int main(){
    HMODULE hMod = LoadLibrary("SimpleDLL.dll");
    if (NULL == hMod)
    {
        cout << "LoadLibrary failed'n";
        PrintFullPath(".''");
        system("PAUSE");
        return 1;
    }
}

在上面的代码中,我打印出当前工作目录。在那个目录中我放置了我的dll。仍然没有加载dll。

如果有关系,我正在使用Visual studio。我也有兴趣看看我如何通过命令行编译上述c++代码并包含dll !

编辑:

我也发现了这一点,但它也依赖于头文件。请注意,我将通过文档了解函数名和格式。我只是没有头文件!

使用DLL's从Java用c#编写

用c#创建的dll与其他dll不同。它们在技术上称为。净程序集。它们依赖于公共语言运行时(CLR),就像Java字节码依赖于Java虚拟机一样。你发布的视频链接并不是在创建。net程序集,而是一个本地的Windows DLL。

显然,如果在一个进程中加载了两个虚拟机,事情就会变得复杂。对于如何使用内存、垃圾收集、内存中对象的布局、线程等,它们都有自己的想法。

这并不是说你想做的事情是不可能的,但它比用LoadLibrary加载本地库要复杂得多。

你可能想看看下面的项目来帮助你:

  • SWiG - www.swig.org -免费,但我不确定有多少额外的工作将涉及到Java接口到c#
  • JNbridge - www.jnbridge.com -不是免费的,但声称使你想做的事情简单
  • Javonet - www.javonet.com -不是免费的,但声称使你想做的事情变得简单
  • IKVM - www.ikvm.net -这是一个有点左领域。它允许您在。net运行时上运行Java字节码,这意味着您可以直接调用。net/c#代码。如果你的Java相当简单,或者你不需要将你的代码部署到很多客户端,这可能适合你。