代码之家  ›  专栏  ›  技术社区  ›  Jim Fell

c dll缺少公共函数

  •  1
  • Jim Fell  · 技术社区  · 14 年前

    我正在尝试使用C.NET Framework 2.0编写一个DLL。一切都可以编译,但是当我尝试从应用程序访问DLL时,在尝试获取过程地址时失败。所以,我在DependencyWalker中打开了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 */ ) { /* ... */ }
        }
    }
    

    除了在类内部以及在命名空间中的类外部定义的一些常量和委托之外,没有其他什么。任何想法或建议都会非常感谢。谢谢。

    5 回复  |  直到 12 年前
        1
  •  2
  •   Tamás Szelei    14 年前

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

    如果您想从托管代码中使用您的DLL,它会容易得多。退房 System.Assembly Activator .

    例如:

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

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

        2
  •  0
  •   JaredPar    14 年前

    这里的部分问题是依赖关系查询器是一个用于本机应用程序的工具。它不理解托管代码,因此不会显示您定义的任何托管类型+方法。

    我对你问题中的这句话感到困惑

    当我试图从我的应用程序访问dll时,它在试图获取过程地址时失败

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

        3
  •  0
  •   Flo.    14 年前

    尝试.NET Reflector查看构建的DLL中的内容(以确保所有内容都是它应该的方式)。 另外,在引用DLL之前,请确保您在构建DLL时处于释放模式…我不知道它是否会改变任何东西,但值得尝试一下。

        4
  •  0
  •   rerun    14 年前

    您需要添加对DLL的引用,运行时将自动允许您调用函数。这里有一点 tutorial 在编写.NET类库时。