从DLL中调用函数?

39

我是C#的新手,正在尝试学习如何使用DLL。我正在尝试将我的对象包装在一个DLL中,然后在我的程序中使用。

public class Foo   // its in the DLL
{
   public void Bar()
   {
      SomeMethodInMyProgram();
   } 
}

我试图将它打包成DLL文件,但是我无法这样做,因为编译器不知道SomeMethodInMyProgram()是什么。

我想这样使用它:

class Program // my program, using DLL
{
    static void Main(string[] args)
    {
       Foo test = new Foo();
       test.Bar();
    }
 } 
5个回答

59

这取决于DLL的类型。它是在.NET中构建的吗?如果是非托管代码,则这里有一个例子,否则 Rob 的答案将适用。

非托管 C++ DLL 示例

using System;
using System.Runtime.InteropServices;

你可能需要使用 DllImport

[DllImport(@"C:\Cadence\SPB_16.5\tools\bin\mpsc.dll")]
static extern void mpscExit();
< p >< em >或者< /em >< /p >
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

然后每个都像这样被称为:

// a specific DLL method/function call
mpscExit();
// user32.dll is Microsoft, path not needed
MessageBox(new IntPtr(0), "Test", "Test Dialog", 0);  

3
那个人显然只是想要一个简单的“添加引用”的答案,你为什么要给他扔这个呢?对于新开发人员来说,Extern和DllImport都属于高级语言。 - TheMonkeyMan
12
这些是常见的“简单”方法,DllImport非常容易上手,但还有更高级的方法可以实现这一点。FYI。 - Tom Stickel
你好,我可以在客户端计算机上调用这个吗?我能调整它的路径吗? - user11861391
1
@Mindex 我其实没有什么头绪 - 2013年我被迫为一家大型芯片公司使用C++,自那时以来我就再也没有用过C++。 - Tom Stickel
mpsc是什么,它与OP问题中的Foo有什么关系? - phil294

35

通过解决方案资源管理器添加DLL——右键单击引用--> 添加引用,然后“浏览”到您的DLL文件,然后它就可以使用了。


如果DLL没有被构建,你就无法通过这种方式访问它。如果是这种情况,我建议使用Tom Stickel的答案。 - CyanCoding
1
@CyanCoding 你说的“内置”是什么意思 - 这种方式添加DLL不需要在GAC或任何地方安装DLL。我可以通过电子邮件发送给你我已经构建的DLL,然后你可以使用这种方法附加它。 - Rob

9
我来晚了,但我为像我一样抓狂的人留下这个答案。所以基本上,在面对这个问题时,我没有使用VS IDE的奢侈条件。我试图通过使用csc命令行编译代码。为了引用一个dll,只需将编译器标志/r:PathToDll/NameOfTheDll添加到csc。

命令应该是这样的:

csc /r:PathToDll/NameOfTheDll /out:OutputExeName FileWhichIsReferencingTheDll.cs

在FileWhichIsReferencingTheDll.cs中加入using namespace AppropriateNameSpace;以访问函数(通过调用类. functionName如果是静态的,或者通过创建类的对象并在对象上调用函数)。


5

你需要在运行时将DLL实际加载到应用程序中,因此是DLL的动态部分。还需要头文件定义DLL中有哪些函数,这样编译器才知道哪些函数已被定义。我的知识基于C++,关于C#如何工作我不太确定,但它会与此类似...


4
C#在这方面与C\C++有很大的不同。.NET运行时可以从.dll中提取足够的信息来确定方法签名(在C#中没有头文件)。 - Jimmy
3
啊,好的。那么...继续吧。 - thecoshman

2

这是我的源代码DLL(AllInOne),其中有一个名为Calculate的类,该类有一个方法GetAreaofSquare。

namespace AllInOne
{
    public class Calculate
    {   
        public double GetAreaOfSquare(double side)
        {
            return side * side;
        }
    }
}

我已将此DLL添加到项目中解决方案资源管理器中的引用中,该项目是控制台应用程序,并将AllInOne添加到系统命名空间中。请仔细查看"使用AllInOne"。我们可以像下面显示的那样实例化Calculate类,然后可以使用GetAreaofSquare方法来计算正方形的面积。

using AllInOne;

namespace UsingDLLinApplication
{
    public class GetResult
    {
        static void Main()
        {
            Calculate myEveryCalculation = new Calculate();
            double storeAreaOFSquare = myEveryCalculation.GetAreaOfSquare(4.5);
            Console.WriteLine("The area of Square is {0}", storeAreaOFSquare);
            Console.ReadLine();
        }
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接