【问题标题】:Launch Dll using C# program使用 C# 程序启动 Dll
【发布时间】:2011-03-10 11:27:59
【问题描述】:

我有一个 C# 表单应用程序...我创建了一个 Dll...现在我想使用该程序启动该 dll。我该怎么做?

#include <windows.h>

typedef int (*function1_ptr) ();

function1_ptr function1=NULL;

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { 

HMODULE myDll = LoadLibrary("Dll1.dll"); 

    if(myDll!=NULL) {  
        function1 = (function1_ptr) GetProcAddress(myDll,"function1");  

        if(function1!=NULL)  
            function1();
        else
            exit(4);

        FreeLibrary(myDll);
    }
    else
        exit(6);
    GetLastError();

    return 0;
}

这是用于测试我的 dll 的代码......即 Dll1.dll..function1 是 dll1.dll 中的函数......我可以用 C# 代码做类似的事情吗???

【问题讨论】:

  • 你在说什么“启动”一个 DLL ? dll 是类的容器。 dll 中没有入口点。
  • 使用此程序调用 DLL....为了查看 DLL 是否工作...我尝试了一个调用 DLL 的代码...这帮助我弄清楚了DLL 工作
  • 你所说的“dll是否工作”是什么意思你如何定义工作? dll中的每个函数?只是某一个?没有运行 dll 这样的事情。
  • 您的问题意味着某种动态加载从消费者进程调用 dll,这与简单地引用您的程序集然后从您的代码中使用它不同。这是设计时间与运行时间。你应该对你问的东西更具体。
  • 这相当模糊,我怀疑您的意思是“如何从外部 C 库执行函数?”或许还有“如何在运行时动态加载 c 库?”

标签: c# dll


【解决方案1】:

要执行代码示例的操作,请使用以下 C# 代码:

public static class DllHelper
{
    [System.Runtime.InteropServices.DllImport("Dll1.dll")]
    public static extern int function1();
}

private void buttonStart_Click(object sender, EventArgs e)
{
    try
    {
        DllHelper.function1();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}      

上面的例子是一个 C# 程序,它调用非基于 .NET 的 DLL 中的函数。 下面的示例是一个 C# 程序,它调用基于 .NET 的 DLL 中的函数。

try
{
    System.Reflection.Assembly dll1 = System.Reflection.Assembly.LoadFile("Dll1.dll");
    if (dll1 != null)
    {
        object obj = dll1.CreateInstance("Function1Class");
        if (obj != null)
        {
            System.Reflection.MethodInfo mi = obj.GetType().GetMethod("function1");
            mi.Invoke(obj, new object[0]);
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

这两个示例中的任何一个都是您想要的吗? 或者您是否尝试从示例代码中调用 DLL 中的 C# 函数?

【讨论】:

    【解决方案2】:

    我假设您想使用 DLL 的功能?如果是这样,请创建对 DLL 的引用并在您的 C# 表单应用程序中使用它。换句话说,为包含在 DLL 中的应用程序逻辑创建一个“用户”界面。如果这没有意义,您应该查看如何添加对项目的引用。

    【讨论】:

      【解决方案3】:

      使您的 dll 可执行,然后使用诊断中的 Process 类:

      http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

                  Process myProcess = new Process();
      
                  try
                  {
                      myProcess.StartInfo.UseShellExecute = false;
                      // You can start any process, HelloWorld is a do-nothing example.
                      myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
                      myProcess.StartInfo.CreateNoWindow = true;
                      myProcess.Start();
                      // This code assumes the process you are starting will terminate itself. 
                      // Given that is is started without a window so you cannot terminate it 
                      // on the desktop, it must terminate itself or you can do it programmatically
                      // from this application using the Kill method.
                  }
                  catch (Exception e)
                  {
                      Console.WriteLine(e.Message);
                  }
      

      【讨论】:

      • 为什么要让它可执行?我正在使用 .Net Core,它的目的是在跨平台上运行我的应用程序。我想运行一个 dll,至少这是我的偏好。
      【解决方案4】:

      术语启动和 DLL 是一些不兼容的概念。操作系统启动具有已定义入口点的二进制程序:main 方法。 DLL 最好被视为具有 API 形式的多个入口点的二进制文件。在这种情况下启动需要操作系统在这些众多入口点之间进行选择。

      您是否尝试使用 DLL 中的特定对象?如果是这样,请尝试以下操作

      • 右键单击“解决方案资源管理器”中的项目并选择“添加引用”
      • 选择“浏览”标签
      • 导航到有问题的 DLL 并点击确定

      现在您将能够在项目中使用 DLL 中的类型。

      MyOtherDLLNamespace.TheType local = ...
      

      【讨论】:

        【解决方案5】:

        您可以为 exe 执行此操作:

           Process.Start("yourProcess");
        

        如果您想将 dll 加载到您的进程中然后使用它,您也可以使用 AppDomain 对象。

        最后你可以使用

          Assembly.Load(...) 
        

        每个都有自己的用途,我建议初学者在 msdn 上阅读所有这些内容。

        【讨论】:

          【解决方案6】:

          添加 DLL 作为对表单应用程序的引用。然后,您将能够从应用程序代码访问其中的命名空间和类。

          【讨论】:

            【解决方案7】:

            在您的 C# 应用程序中,添加对您创建的程序集(DLL)的引用。您可以通过解决方案资源管理器窗口执行此操作 - 右键单击​​引用,然后说“添加引用...”并选择您的 DLL。

            此时,您可以在 C# 表单类的顶部添加“using YourDllNamespace;”,并根据需要使用 DLL 中定义的类型。

            【讨论】:

              【解决方案8】:

              你可以使用不同的方法,一种是

              Assembly.Load 
              

              另一个正在使用 DllImport 属性:

              [DllImport("mylib.dll)]
              

              【讨论】:

                【解决方案9】:

                您可以 add reference 将该 dll 放入您的项目中。

                要添加参考,请使用以下步骤:

                1.转到项目菜单解决方案资源管理器
                2.添加参考
                3. 浏览你的 dll
                4. 好的

                【讨论】:

                  猜你喜欢
                  • 2012-06-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-08-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多