C#DLL缺少公共函数

C#DLL缺少公共函数,c#,dll,c#-2.0,dependency-walker,C#,Dll,C# 2.0,Dependency Walker,我正在尝试使用C#.NET Framework 2.0编写DLL。一切都可以编译,但当我尝试从应用程序访问DLL时,它在尝试获取过程地址时失败。所以,我在Dependency Walker中运行了DLL,我所有的公共函数都丢失了 到目前为止,我的DLL相当简单: namespace MyDll_Namespace { public class MyDllClass { public static int Func1( /* params */ ) { /* ...

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

除此之外,在类内部以及命名空间中的类外部定义的常量和委托不多。如有任何想法或建议,将不胜感激。谢谢。

Dependency walker适用于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);

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

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

我被你问题中的这句话弄糊涂了

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


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

请尝试.net Reflector,以查看构建的DLL中到底有什么内容(以确保一切都按预期的方式进行)。
在引用DLL之前,还要确保在构建DLL时处于发布模式。。。我不知道它是否会改变什么,但值得尝试一下。

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

我决定用C++编写我的DLL。但是,以下是我从非托管代码中找到的一些有用信息,用于使用托管代码:


  • 由于复杂性,我决定在C++中编写自己的DLL。这一点现在有点超出我的头脑。举个例子会很有帮助。谢谢,由于复杂,我决定用C++写我的DLL。