【问题标题】:C# DLL Missing Public FunctionsC# DLL 缺少公共函数
【发布时间】:2011-04-30 08:16:18
【问题描述】:

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

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

【问题讨论】:

标签: c# dll c#-2.0 dependency-walker


【解决方案1】:

Dependency walker 适用于 win32 DLL(本机代码),而不是 .NET 程序集(托管代码)。它不会在任意类中找到方法(即使它们是静态的)。如果您需要从本机代码调用托管代码,有一些方法可以做到这一点,but it's not pretty

如果您想从托管代码中使用您的 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);

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

【讨论】:

  • 目前这有点超出我的想象。一个例子会很有帮助。谢谢。
  • 由于复杂性,我决定用 C++ 编写我的 DLL。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您需要添加对 dll 的引用,运行时将自动允许您调用您的函数。下面是关于编写 .net 类库的一点 tutorial

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        • 2020-11-11
        相关资源
        最近更新 更多