【问题标题】:Static constructor is not called [duplicate]不调用静态构造函数[重复]
【发布时间】:2016-07-18 21:12:31
【问题描述】:

我有以下课程:

 private static class NativeSomeWrapper
   {
       [DllImport(NativeMethods.myCeeLib, EntryPoint = "Get_300_bars",
           CallingConvention = CallingConvention.Cdecl)]
       [return: MarshalAs(UnmanagedType.SysInt)]
       internal static extern IntPtr Get300bars([MarshalAs(UnmanagedType.SysInt)] IntPtr assessment);
   }

我有一个负责初始化 dll 的静态类:

internal static class NativeMethods
{
    public const string myCeeLib= "myCeeLib.dll";


    static NativeMethods()
    {
        var path = GetPathToMyCeeLibFile();
        var err = SetPath(path);
        if (err != ErrorCode.Ok)
        {
            throw new FileNotFoundException("Coulnt find myCeeLib file.");
        }
    }
}

问题是NativeMethods 构造函数没有按预期调用。

如何确保NativeMethods 静态构造函数被调用并且库文件的路径设置正确?

【问题讨论】:

  • 访问NativeMethods 成员后会立即调用它。你在任何地方都给NativeMethods打电话吗?
  • 您是否以某种方式访问​​ NativeMethods 类?检查这个:stackoverflow.com/questions/1437352/…
  • @Quantic 正如问题所说,这是一个静态构造函数。这不仅仅是一种方法。
  • 如标记的副本中所述,静态构造函数仅在您首次创建类的实例或访问任何静态成员时调用。 const 成员不是静态成员,因此不会导致调用静态构造函数。当然,由此您可以轻松推断出将const 成员更改为static 成员 确保调用静态构造函数,但随后您会发现使用时遇到问题DllImport 属性中的那个成员。
  • 我同意,但问题不在于静态构造函数。实际的问题是,是否有办法检查 DllImport 文件是否存在,或者甚至如何设置路径……这就是我同意的地方,应该是一个新问题。

标签: c#


【解决方案1】:

编译器将在编译时计算该属性的值,因此当您执行程序时静态构造函数不会运行,因为在应用程序启动时 em> 值已经被计算出来,你不需要访问类来获取它(从而触发静态构造函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2013-08-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多