我正在尝试使用 C# .NET Framework 2.0 编写 DLL。一切都编译正常,但是当我尝试从应用程序访问 DLL 时,尝试获取过程地址时失败。因此,我在 Dependency Walker 中操作了 DLL,但我的所有公共函数都丢失了!

到目前为止,我的 DLL 相当简单:

namespace MyDll_Namespace
{
    public class MyDllClass
    {
        public static int Func1( /* params */ ) { /* ... */ }

        public static int Func2( /* params */ ) { /* ... */ }

        public static int Func3( /* params */ ) { /* ... */ }

        public static int Func4( /* params */ ) { /* ... */ }
    }
}

没有太多其他内容,只有一些在类内部以及类外部的命名空间中定义的常量和委托。任何想法或建议将不胜感激。谢谢。

其他提示

依赖遍历器适用于 win32 DLL(即 本机代码),而不是 .NET 程序集(这是 托管代码)。它不会在任意类中找到方法(即使它们是静态的)。如果您需要从本机代码调用托管代码,有多种方法可以做到这一点, 但它并不漂亮.

如果您想从托管代码中使用 dll,那就容易多了。查看 系统.装配活化剂.

一个例子:

var assembly = Assembly.LoadFile(@"\path\to\your.dll");
var mydllclass_type = assembly.GetType("MyDllClass");
var instance = Activator.CreateInstance(mydllclass_type);

该实例将是一个对象。要调用这些方法,您需要使用反射,因为接口在编译时是未知的。

如果您正在创建一个插件系统,最好的方法是为所有插件提供一个通用接口或抽象基础,并让您的程序引用它。那些实施插件的第三方也将参考本合同。在这种情况下,最后一行稍微改变一下:

var instance = (IMyDllClass)Activator.CreateInstance(mydllclass_type);

现在您可以像在常规构造的对象中一样使用这些方法。

这里的问题的部分原因是,依赖沃克是本机应用程序的工具。它不理解托管代码,因此不会显示任何托管类型+方法您已经定义。

我被这条线在你的问题混淆

  

当我尝试从我的应用程序访问DLL,它试图获取过程地址

当失败

这听起来有点像一个错误我将在本机应用程序,而不是管理的一个看到。你们是不是从本机应用程序访问的C#代码?如果是这样,这只能通过COM魔法,而不是通过直接调用来完成。你能否更详细地解释什么是在怎么回事?

尝试.NET反射来看看到底什么是你创建的DLL内(以确保一切是应该的方式)。 另外,还要确保你在释放模式,同时参考之前建立您的DLL ...我不知道它是否会改变什么,但它实在值得在try =)

您需要将引用添加到您的DLL和运行时会自动让你打电话给你的功能。这里是一个小教程上写入一个.net类库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top