لماذا لا يمكنني الحصول على type.gettype () للعثور على نوع مثيل البرنامج المساعد الخاص بي المشار إليه في التطبيق.

StackOverflow https://stackoverflow.com/questions/1688420

  •  18-09-2019
  •  | 
  •  

سؤال

إذن إليك الصفقة. لقد حصلت على الحل الذي لديه عدد قليل من المشاريع في ذلك:

  • مشروع Wrapper - هذا مجرد تطبيق لوحي يقف حاليا في خدمة Windows أثناء تصحيح الأخطاء.
  • مشروع عامل - هذا يحتوي على الشجاعة من التعليمات البرمجية. بهذه الطريقة يمكنني تصحيح التعليمات البرمجية بسهولة لخدمة Windows دون الصداع.
  • مشروع مكتبة مساعدية - يحتوي هذا على مصنع مساعد إلى مثيل ملموس جديد من البرنامج المساعد.
  • مشروع البرنامج المساعد - يحتوي هذا على تطبيق ملموسي على البرنامج المساعد الخاص بي.

يحتوي تطبيق Wrapper الخاص بي على App.Config الذي يجب مرجعي البرنامج المساعد الخاص بي مباشرة عن التكوين الذاتي. بهذه الطريقة لا يحتاج تطبيق Wrapper الخاص بي إلى معرفة أي شيء آخر غير أنه يحتاج إلى استدعاء مصنع المحول إلى جديد مثيل البرنامج المساعد.

<configuration>
  <appSettings>
    <add key="Plugin" value="Prototypes.BensPlugin" />
    <add key="Prototypes.BensPlugin.ServiceAddress" value="http://localhost/WebServices/Plugin.asmx" />
    <add key="Prototypes.BensPlugin.Username" value="TestUserName" />
    <add key="Prototypes.BensPlugin.Password" value="TestPassword" />
  </appSettings>
</configuration>

مشروع المجمع:

using Worker;

public class Program
{
    public static void Main()
    {
        var serviceProc = new ServiceProcess();
        serviceProc.DoYourStuff();
    }
}

مشروع عامل:

using PluginLibrary;

namespace Worker
{
    public class ServiceProcess
    {
        public string GetRequiredAppSetting(string settingName)
        {
            /* Code to get a required configuration setting */
        }

        public void DoYourStuff()
        {
            string pluginTypeName = GetRequiredAppSetting("Plugin"); 
            //At this point, pluginTypeName = "Prototypes.BensPlugin"
            Type type = Type.GetType(pluginTypeName); //type == null, wth!?

            //string testTypeName = new BensPlugin().GetType().ToString();
            ///At this point, testTypeName = "Prototypes.BensPlugin"
            //Type testType = Type.GetType(testTypeName)
            ///And testType still equals null!

            if (type != null)
            {
                IPlugin plugin = PluginFactory.CreatePlugin(type);
                if (plugin != null)
                plugin.DoWork();
            }
        }
    }
}

مكتبة البرنامج المساعد:

namespace PluginLibrary
{
    public interface IPlugin
    {
        void DoWork();
    }

    public class PluginFactory
    {
        public IPlugin CreatePlugin(Type pluginType)
        {
            return (IPlugin)Activator.CreateInstance(pluginType);
        }
    }
}

توصيل في:

using PluginLibrary;

namespace Prototypes
{
    public class BensPlugin : IPlugin
    {
        public string ServiceAddress { get; protected set; }
        public string username { get; protected set; }
        public string password { get; protected set; }

        public void DoWork()
        {
            Trace.WriteLine("Ben's plugin is working.");
        }

        public BensPlugin()
        {
            /* Code to self configure from app.config */
        }
    }
}

حسنا، بحيث يحدد المرحلة. حيث أنا قادم فاصل في مشروع عاملي عندما أشير Type.GetType(pluginTypeName). وبعد لي pluginTypeName يتم سحبها من التكوين بشكل صحيح، ولكن Type.GetType(pluginTypeName) عائدات null. وبعد لقد جربت إنشاء مثيل على البرنامج المساعد الخاص بي مباشرة في نفس المكان في الكود:

var obj = new BensPlugin();

هذا يعمل بشكل جيد، و obj.GetType().ToString() إرجاع نفس السلسلة بالضبط كما قمت بتكوينها في app.config.

هل يمكن لأي شخص أن يخبرني لماذا يمكنني استخدام كائن ملموس في تلك المرحلة في التعليمات البرمجية، لكن Type.GetType(pluginTypeName) ستفشل؟

هل كانت مفيدة؟

المحلول

قد يكون ذلك بحاجة إلى تحديد التجميع الذي يقع في:

<add key="Plugin" value="Prototypes.BensPlugin, TheAssemblyName" />

نصائح أخرى

بدلا من الاتصال Type.GetType(pluginTypeName), ، يحاول Type.GetType(pluginTypeName, true). وبعد تشير المعلمة المنطقية إلى ما إذا كان يجب أن تكون المكالمة رمي استثناء في حالة فشل، بدلا من العودة null - بهذه الطريقة، يجب عليك الحصول على (نأمل) أفضل وصف لماذا Getype فشل بدلا من مجرد غامض null!

هو plugintypename باستخدام تسمية التجميع المؤهلة للتجميع؟ هل تجميع الجمعية التي تحتوي على مكونات بريدية تظهر بأنها محملة؟

إذا كنت تستخدم الاسم المؤهل التجميع، يجب أن تكون .NET قادرا على تحميل التجميع تلقائيا لك؛ إذا لم تكن كذلك وأعتقد ذلك Type.GetType() يتم إرجاع NULL لأنه لا يمكن تحديد موقع تجميع يحتوي على النوع المطلوب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top