使用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 !
编辑:我也发现了这一点,但它也依赖于头文件。请注意,我将通过文档了解函数名和格式。我只是没有头文件!
用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相当简单,或者你不需要将你的代码部署到很多客户端,这可能适合你。