1

我正在尝试使用 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 */ ) { /* ... */ }
    }
}

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

4

5 回答 5

2

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

如果你想从托管代码中使用你的 dll,那就容易多了。查看System.AssemblyActivator

一个例子:

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);

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

于 2010-10-25T17:13:15.397 回答
0

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

我对你问题中的这一行感到困惑

当我尝试从我的应用程序访问 DLL 时,尝试获取过程地址时失败

这听起来有点像我在本机应用程序中看到的错误,而不是托管应用程序。您是否尝试从本机应用程序访问 C# 代码?如果是这样,这只能通过 COM 魔术而不是直接调用来完成。你能更详细地解释一下这里发生了什么吗?

于 2010-10-25T17:14:41.927 回答
0

尝试使用 .net Reflector 来准确查看您构建的 DLL 中的内容(以确保一切都按照预期的方式进行)。在引用它之前,还要确保在构建 DLL 时处于发布模式...我不知道它是否会改变任何东西,但值得一试 =)

于 2010-10-25T17:16:50.547 回答
0

您需要添加对 dll 的引用,运行时将自动允许您调用函数。这是一个关于编写 .net 类库的小教程。

于 2010-10-25T17:16:53.387 回答