好吧,我一直在挖掘這一點,並正在尋找輸入。Java .NET互操作
我需要一個可以加載和卸載本機庫的Java應用程序,很簡單,C/C++/Java/Scripts/Executables/etc。使用JNI和其他內置功能並不是真正的問題。
但是,我需要能夠加載.NET庫,這一直是令人沮喪的。我的第一個attept是使用JNI和調用C++封裝爲低於:
的Java:
this.Lib = (LibHandler)Native.loadLibrary("MyLib", LibHandler.class);
的CPP:
#include <jni.h>
#using <MyLibCSharp.dll>
#include <vcclr.h>
#include <msclr\marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
using namespace System;
extern "C"
{
JNIEXPORT jstring JNICALL Java_Test(JNIEnv * env)
{
marshal_context^context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(CSharp::Class1::Test());
jstring js = env->NewStringUTF(str4);
return js;
}
JNIEXPORT jstring JNICALL Java_Test2(JNIEnv * env, jobject jobj)
{
marshal_context^context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(CSharp::Class1::Test());
jstring js = env->NewStringUTF(str4);
return js;
}
}
這將汽車無故障,甚至被系統加載,我可以交換文件,以便MyLib.dll實際上是C#之一,它成功加載它(但未能找到任何函數,因爲它不是一個本地C庫,我不認爲.NET可以像C++一樣導出),所以我沒有文件位置問題。
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'MyLib.dll': The specified module could not be found.
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:379)
at com.sun.jna.Native.loadLibrary(Native.java:364)
at EntryPoint.main(EntryPoint.java:31)
我想我會嘗試編譯C#庫作爲一個COM對象,並調用它的方式,唉:
Exception in thread "main" com.jacob.com.ComFailException: Can't co-create object
at com.jacob.com.Dispatch.createInstanceNative(Native Method)
at com.jacob.com.Dispatch.<init>(Dispatch.java:99)
at com.jacob.activeX.ActiveXComponent.<init>(ActiveXComponent.java:58)
at EntryPoint.main(EntryPoint.java:33)
C#代碼:
ActiveXComponent comp = new ActiveXComponent("MyLib.Class1");
與失敗:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace MyLib
{
[Guid("4F3A0A13-4D2B-4DE6-93EA-D6861C230290"),
ComVisible(true)]
public interface ITest
{
[DispId(1)]
string Test();
}
[Guid("A78C5820-3E4B-49B3-8C8E-63DD12346410"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
ComVisible(true)]
public interface ITestEvents
{
}
[Guid("3ECD46AE-E8F4-4B62-B9DC-DD7F6CB435E2"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ITestEvents)),
ComVisible(true)]
public class Class1 : ITest
{
public string Test()
{
return "This is my C# DLL COM returning a string! heh!";
}
}
}
我可以看到COM是註冊表ered,我可以用oleview.exe來瀏覽它,但是我不能從vbScript中調用它...我對這個問題感到困惑,所以我完全沒有想法,這真的是一整天都在絞盡腦汁。
我想像要脫離COM,但我需要保持相當簡單(庫不會由我們開發,所以我不想丟棄一堆C/C++代碼到VB6開發者的一圈)。
我會回到CLI C++實現方法,因爲它很簡單,幾乎任何人都可以做到。
任何想法將不勝感激,謝謝。
編輯:
我不能使用的System.loadLibrary,不會讓我卸載庫,例如Native.LoadLibrary與分配的種類呢。
:
下面你可以使用.NET Random類找到Javonet的示例代碼(它注意到,與第三方橋你不僅可以自定義DLL,但完整的.NET框架的訪問是非常重要的)可能的重複[調用C#代碼從Java?](http://stackoverflow.com/questions/50398/calling-c-sharp-code-from-java) – Unsigned 2014-01-15 04:44:31