ठीक है, मैं थोड़ी देर के लिए इस पर खुदाई कर रहा हूं और इनपुट की तलाश में हूं।जावा .NET इंटरऑप
मुझे जावा एप्लिकेशन की आवश्यकता है जो मूल पुस्तकालयों को लोड और अनलोड कर सकता है, पर्याप्त सरल, सी/सी ++/जावा/स्क्रिप्ट/एक्जिक्यूटिव/आदि। जेएनआई और अन्य सुविधाओं में निर्मित कोई वास्तविक समस्या नहीं है।
हालांकि, मुझे .NET पुस्तकालयों को भी लोड करने की क्षमता की आवश्यकता है, यह पागल निराशाजनक रहा है।
जावा:
this.Lib = (LibHandler)Native.loadLibrary("MyLib", LibHandler.class);
सीपीपी:
#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;
}
}
यह लगातार विफल हो जाएगा भी प्रणाली द्वारा लोड करने के लिए मेरा पहला attept रूप में नीचे है JNI का उपयोग करें और एक सी ++ आवरण कहते थे , मैं फ़ाइलों को स्वैप कर सकता हूं ताकि MyLib.dll वास्तव में 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)
मैं सोचा मैं एक 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)
सी # कोड:
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 से नहीं बुला सकता ... मैं उस पर उलझन में हूं, इसलिए मैं पूरी तरह से विचारों से बाहर हूं, यह वास्तव में पूरे दिन मेरे दिमाग को रैक कर रहा है।
मैं चाहें कॉम से दूर होने की, लेकिन मैं implmentation काफी सरल (पुस्तकालयों अभ्यस्त हमारे द्वारा विकसित किया जा, तो मैं में C/C++ कोड का एक समूह छोड़ने के लिए नहीं करना चाहती रखने की जरूरत है वीबी 6 डेवलपर्स की गोद)।
मैं सीएलआई सी ++ कार्यान्वयन विधि पर वापस जाने के साथ ठीक हूं, क्योंकि यह इतना सरल है क्योंकि लगभग कोई भी इसे कर सकता है।
किसी भी विचार की अत्यधिक सराहना की जाएगी, धन्यवाद।
संपादित करें:
मैं System.LoadLibrary उपयोग नहीं कर सकते, अभ्यस्त मुझे एक नियत वर्ग करता है के साथ Native.LoadLibrary तरह पुस्तकालयों उतारना करते हैं।
:
नीचे आप नेट रैंडम वर्ग का उपयोग कर Javonet का नमूना कोड प्राप्त कर सकते हैं (यह है कि तीसरे पक्ष के पुल के साथ आप न केवल अपने कस्टम DLL लेकिन पूर्ण .NET फ़्रेमवर्क तक पहुँच प्राप्त सूचना के लिए महत्वपूर्ण है) संभावित डुप्लिकेट [जावा से कॉलिंग सी # कोड?] (http://stackoverflow.com/questions/50398/calling-c-sharp-code-from-java) – Unsigned