是否可以从DLL中调用应用程序中的代码?

狂暴风暴

知名会员
已加入
2014年8月6日
留言内容
85
地点
南非鲁德普特
编程经验
10+
早上( ;) )全部,

我正在忙于一个应用程序,在编写代码时,我可以看到在稍后的阶段将该应用程序的一部分(一个类)转换为DLL(没有创建DLL的经验,但这不是问题的一部分)会很有用。 )。

下面的代码是我认为要移至DLL的类的一部分
namespace dllNamespace
{
    class classInDLL
    {
        predefinedNamespace.predefinedClass myclass = new predefinedNamespace.predefinedClass();

        string executeresult=null;

        public bool doSomework(string strInput)
        {
            string result1 = "S2";
            string result2 = "b0001";
            executeresult = someMethod(result1, result2);
        }

        public string getResult()
        {
            return executeresult;
        }

        private string someMethod(string strA, string strB)
        {
            return myclass.execute_Enter(strA, null, strB);
        }
    }
}


这是将保留在应用程序中的代码,或需要在以后使用DLL的应用程序中进行编码的代码
namespace predefinedNamespace
{
    class predefinedClass
    {
        public string execute_Enter(string strBase, string strInput, string strOutput)
        {
            string toExecute = strBase + "_Enter";
            System.Reflection.MethodInfo mi = this.GetType().GetMethod(toExecute);

            if (mi == null)
            {
                return genericMethod(toExecute);
            }
            else
            {
                return (string)mi.Invoke(this, new object[] { strOutput });
            }
        }

        public string S2_Enter(string strValue)
        {
            uint result;
            if (LibraryWim.Utils.String2UInt(strValue, out result))
            {
                return "Result of entering S2: output value b" + Convert.ToString(result, 2).PadLeft(32, '0');
            }
            else
            {
                return "S2: Invalid output defined";
            }
        }

        public string genericMethod(string strBase)
        {
            return String.Format("This is the result of a generic method as no method matching '{0}' is coded by the programmer", strBase);
        }
    }
}


这个想法是,可以从DLL中定义使用DLL的应用程序中特定类中的用户定义方法(编译DLL时未知)。因此,使用DLL的程序员将实现应用程序所需的方法。 DLL可能会假设在运行时,如果没有引发异常,则类预定义名称空间。预定义的类将可用。

这可能吗?如果是这样,我需要继续阅读什么?

这个想法是,用户在应用程序中输入一些数据,然后调用DLL中的一个方法,并根据该方法的“结果”调用另一个在DLL之外的方法。
namespace applicationNamespace
{
    private void Go()
    {
        dllNamespace.classInDLL theClass = new dllNamespace.classInDLL();
        theClass.doSomework("SomeUserInput");
Console.WriteLine(theClass.getResult());
    }
}


我希望这有点清楚。
 

狂暴风暴

知名会员
已加入
2014年8月6日
留言内容
85
地点
南非鲁德普特
编程经验
10+
后续问题

我已经实现了一些东西,并且效果很好。但是,有一个问题我找不到答案。

下面的代码(在DLL中)触发两个事件之一,然后返回true或false。
        public bool gotoNext()
        {
            currentstate++;
            // simulate statechange result
            if (currentstate < numstates)
            {
                // state has changed
                StateChangedEventArgs args = new StateChangedEventArgs();
                args.State = currentstate;
                OnStateChanged(args);
                return true;
            }
            else
            {
                // state has not changed
                StateChangedEventArgs args = new StateChangedEventArgs();
                args.State = currentstate;
                OnStateNotChanged(args);
                return false;
            }
        }


问题是事件的顺序。在显示的代码返回之前,事件的触发是否总是导致其余代码中的事件处理程序被调用?因此,是否与“直接调用事件处理程序”(如调用方法)相同?调试表明情况确实如此,但是我需要知道是否需要适应可能并非如此的情况。

提前致谢。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,502
地点
悉尼,澳大利亚
编程经验
10+
问题是事件的顺序。在显示的代码返回之前,事件的触发是否总是导致其余代码中的事件处理程序被调用?因此,是否与“直接调用事件处理程序”(如调用方法)相同?调试表明情况确实如此,但是我需要知道是否需要适应可能并非如此的情况。

是的,在所有情况下都是如此。在您的OnStateChanged方法中,您应该有一个RaiseEvent语句。该语句基本上遍历该事件的处理程序,并按顺序执行每个处理程序。该语句不会完成,因此,在所有事件处理程序都已执行之前,您的方法不会返回。

编辑:我所说的关于OnStateChanged方法适用于VB,而不是C#。我忘记了我刚才在哪个论坛。在C#中,该方法应首先测试事件是否为null,即是否未注册任何处理程序,如果尚未注册,则调用它,这基本上意味着内部循环每个注册的处理程序。它与RaiseEvent几乎相同,只不过您先明确测试了null。
 

狂暴风暴

知名会员
已加入
2014年8月6日
留言内容
85
地点
南非鲁德普特
编程经验
10+
谢谢。我认为您指的是这种类型的代码。

        protected virtual void OnStateChanged(EventArgs e)
        {
            EventHandler<StateChangedEventArgs> handler = StateChanged;
            if (handler != null)
            {
                handler(this, (statemachineDLL.StateChangedEventArgs) e);
            }
        }
 
最佳 底部