如何使用C#加载DLL

本文关键字:DLL 加载 何使用 | 更新日期: 2023-09-27 18:29:07

我有一个小DLL,它有3个函数:Init、Load和run。我是c#的新手,所以当我读到这里的问题时,我打开了一个控制台项目,想加载DLL并使用它的函数。不幸的是,它没有起作用。有人能告诉我出了什么问题吗?

这是我得到的错误:

Unable to find an entry point named 'Init' in DLL 
'....path to my DLL....'.

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
   class Program
    {
       [DllImport("C:''Desktop''DLLTest.dll", CharSet = CharSet.Unicode)]
        public static extern bool Init();
        [DllImport("C:''Desktop''DLLTest.dll", CharSet = CharSet.Unicode)]
         public static extern bool Load(string file);

         [DllImport("C:''Desktop''DLLTest.dll", CharSet = CharSet.Unicode)]
        public static extern bool Play();

        static void Main()
        {
            Console.WriteLine("got till here!!!");
            Init();
            Load("C:''Desktop''the_thing_about_dogs_480x270.mp4");
            Play();
        }
    }

}

我唯一能怀疑的可能是我没有创建实例?除此之外,没有任何线索:(

*编辑:*这是DLL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DLLTest
{
    public class DLLTestApi
    {
    myInfo localPlay;
    public bool Init()
    {
        localPlay =  new myInfo();
        return true;
    }

    public bool Load(string file)
    {
        localPlay.Load(file);
        return true;
    }
    public bool Play()
    {
        localPlay.StartNewThread();
        return true;
    }
    public bool Stop()
    {
        localPlay.DxStopWMp();
        return true;
    }
    public bool Pause()
    {
        localPlay.DxPause();
        return true;
    }
    public bool Resume()
    {
        localPlay.DxResume();
        return true;
    }
    public bool Close()
    {
        localPlay.DxClose();
        return true;
    }
}
}

如何使用C#加载DLL

错误消息告诉您问题出在哪里。您的DLL不导出名为Init的函数。可能的原因包括:

  1. 该DLL不是非托管DLL
  2. DLL只是不导出该名称的函数
  3. DLL导出该函数,但名称被修饰或损坏

诊断故障的最简单方法可能是使用像DependencyWalker这样的工具来检查DLL的导出。

更新

从编辑到问题,很明显,第1项就是原因。您的DLL是托管DLL,尝试使用p/invoke访问它是不正确的。只需将其添加为控制台应用程序项目的引用即可。

若要动态加载dll,不确定它是否适用于托管dll,请使用System.Reflection中的Assembly.LoadFrom();

若要创建实例,请使用System.Activator中的Activator.CreateInstance();