मैं अपने आवेदन के लिए कुछ विस्तार प्रदान करने के लिए एक प्लगइन सिस्टम लिखने की कोशिश कर रहा हूं ताकि कोई भी मुख्य एप्लिकेशन के कोड को छूए बिना एप्लिकेशन के लिए प्लगइन लिख सके (और कुछ तोड़ने का जोखिम)।लेखन सी # प्लगइन सिस्टम
मुझे मिल गया है (अभी तक एटीएम, कुछ भी कार्यान्वित किया जाता है) आधार "IPlugin" इंटरफेस लिखा
यहाँ कैसे मैं लोड हो रहा है कर रहा हूँ है:
public static void Load()
{
// rawr: http://www.codeproject.com/KB/cs/c__plugin_architecture.aspx
String[] pluginFiles = Directory.GetFiles(Plugins.PluginsDirectory, "*.dll");
foreach (var plugin in pluginFiles)
{
Type objType = null;
try
{
//Assembly.GetExecutingAssembly().GetName().Name
MessageBox.Show(Directory.GetCurrentDirectory());
Assembly asm = Assembly.Load(plugin);
if (asm != null)
{
objType = asm.GetType(asm.FullName);
if (objType != null)
{
if (typeof(IPlugin).IsAssignableFrom(objType))
{
MessageBox.Show(Directory.GetCurrentDirectory());
IPlugin ipi = (IPlugin)Activator.CreateInstance(objType);
ipi.Host = Plugins.m_PluginsHost;
ipi.Assembly = asm;
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "Unhandled Exception! (Please Report!)", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
}
}
}
एक दोस्त ने मदद करने के लिए कोशिश की, लेकिन मैं वास्तव में समझ में नहीं आया कि क्या गलत था।
प्लगइन्स के लिए फ़ोल्डर संरचना है निम्नलिखित:
\
\ प्लगइन्स \
सभी प्लगइन्स एक .dll "Lab.Core.dll" कहा जाता है को संदर्भित [जड़] निर्देशिका में है और यह डुप्लिकेट संदर्भ लोड होने के कारण प्लगइन्स निर्देशिका में मौजूद नहीं है।
प्लगइन सिस्टम Lab.Core.dll से लोड किया गया है जिसे मेरे निष्पादन योग्य द्वारा भी संदर्भित किया जाता है। "IPlugin" टाइप करें Lab.Core.dll में भी है। Lab.Core.dll, जैसा कि नाम दिया गया है, मेरे आवेदन का मूल है।
संपादित करें:
प्रश्न: क्यों/क्या है कि अपवाद मैं हो रही है और मैं इसे ठीक करने के बारे में कैसे जा सकते हैं?
अंतिम संपादन:
ठीक है तो मैं यह कुछ स्रोत कोड एक दोस्त एक TF2 नियामक के लिए लिखा था देखने के बाद फिर से लिखने का फैसला किया।
यहाँ मैं क्या मिला है और यह काम करता है:
public class TestPlugin : IPlugin {
#region Constructor
public TestPlugin() {
//
}
#endregion
#region IPlugin Members
public String Name {
get {
return "Test Plugin";
}
}
public String Version {
get {
return "1.0.0";
}
}
public String Author {
get {
return "Zack";
}
}
public Boolean OnLoad() {
MessageBox.Show("Loaded!");
return true;
}
public Boolean OnAllLoaded() {
MessageBox.Show("All loaded!");
return true;
}
#endregion
}
public static void Load(String file) {
if (!File.Exists(file) || !file.EndsWith(".dll", true, null))
return;
Assembly asm = null;
try {
asm = Assembly.LoadFile(file);
} catch (Exception) {
// unable to load
return;
}
Type pluginInfo = null;
try {
Type[] types = asm.GetTypes();
Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.GetName().Name.Equals("Lab.Core"));
Type type = core.GetType("Lab.Core.IPlugin");
foreach (var t in types)
if (type.IsAssignableFrom((Type)t)) {
pluginInfo = t;
break;
}
if (pluginInfo != null) {
Object o = Activator.CreateInstance(pluginInfo);
IPlugin plugin = (IPlugin)o;
Plugins.Register(plugin);
}
} catch (Exception) {
}
}
public static void LoadAll() {
String[] files = Directory.GetFiles("./Plugins/", "*.dll");
foreach (var s in files)
Load(Path.Combine(Environment.CurrentDirectory, s));
for (Int32 i = 0; i < Plugins.List.Count; ++i) {
IPlugin p = Plugins.List.ElementAt(i);
try {
if (!p.OnAllLoaded()) {
Plugins.List.RemoveAt(i);
--i;
}
} catch (Exception) {
Plugins.List.RemoveAt(i);
--i;
}
}
}
है कि मैं ध्यान दें कि आप वास्तव में सवाल नहीं पूछा है, तो आप सिर्फ का वर्णन किया है तुम क्या करने की कोशिश कर रहे क्या इन 2 इंटरफेस का उपयोग करें। क्या आप अपने प्रश्न को प्रश्न के रूप में वाक्यांश दे सकते हैं? –
एरर। क्षमा करें, यह समझाने की कोशिश कर रहा था कि मैं क्या कर रहा था लेकिन सवाल भूल गया। : एक्स मैं इसे संपादित कर दूंगा। – Zack
कृपया प्राप्त पूर्ण अपवाद पोस्ट करें, स्टैक ट्रेस और किसी भी आंतरिक अपवाद के साथ पूरा करें। Ex.ToString() के परिणाम पोस्ट करें। –