使用Java编写的C#编写的DLL

时间:2014-08-18 05:38:19

标签: java c# c++ c dll

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

不是因为我不理解代码。但是因为我跟随的所有教程都在某些方面打破了。

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

然后我继续创建自己的ddl,以便我可以从C库中调用它们。找到了this video,我可以在微软页面上关注它和它的页面来制作dll。请注意,我完全有能力遵循这个例子。我挣扎的那一部分是如果我没有头文件或DLL文件的lib文件会发生什么。所以我开始关注this example,视觉工作室说导入我不存在。

我发现others能够完全相同的工作。

我做错了什么?最终目标,我想知道如何在视频中创建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";
    }
}

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

阅读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 Studios。我也有兴趣看看如何通过命令行编译上面的c ++代码并用它包含dll!

修改

我还找到了this,但它也依赖于头文件。请注意,我将通过文档了解函数名称和格式。我只是没有头文件!

1 个答案:

答案 0 :(得分:6)

使用C#创建的DLL与其他DLL不同。它们在技术上称为 .NET程序集。它们依赖于公共语言运行时(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相当简单和/或您不必将代码部署到许多客户端,这可能对您有用。