1

我有一个小 DLL,它有 3 个功能:初始化、加载和运行。我是 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;
    }
}
}
4

2 回答 2

2

错误消息清楚地告诉您问题所在。您的 DLL 不会导出名为Init. 可能的原因包括:

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

诊断故障的最简单方法可能是使用 Dependency Walker 之类的工具来检查 DLL 的导出。

更新

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

于 2013-08-26T16:00:22.863 回答
0

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

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

于 2013-08-26T23:25:08.123 回答