SharePoint无法在Windows 2008上加载C ++ DLL

我有一个SharePoint DLL,它执行一些许可事务,并且作为代码的一部分,它使用外部C ++ DLL来获取硬盘的序列号。

当我在Windows Server 2003上运行此应用程序时,它工作正常,但在Windows Server 2008上,整个站点(加载时加载)会不断崩溃并重置。 这不是Windows Server 2008 R2,并且在64或32位中是相同的。

如果我在DLL执行之前放置了一个Debugger.Break ,我会看到代码到达中断点,然后再也不会再回到DLL中。 我确实从函数内部得到了一些调试断言警告,只是在Windows Server 2008中,但我不确定这是相关的。

我创建了一个运行C#DLL的控制台应用程序,该应用程序依次加载C ++ DLL,并且这在Windows Server 2008上完美运行(虽然它确实显示了断言错误,但我现在已经抑制了这些错误)。 断言错误不在我的代码中,而是在ICtypes.c ,而不是我可以调试的东西。

如果我在DLL中放置一个断点,它永远不会被击中,编译器会说:

"step in: Stepping over non user code"

如果我尝试使用Visual Studio调试到DLL中。

我曾尝试包装用于调用DLL的代码:

SPSecurity.RunWithElevatedPrivileges(delegate()

但是这也没有帮助。

我有这个DLL的源代码,所以这不是问题。

如果我从目录中删除DLL,我会收到有关缺少DLL的错误。 如果我更换它,回到没有错误或警告只是一个完整的失败。

如果我用硬编码的字符串替换这个代码,整个应用程序都可以正常工作。

任何意见将不胜感激,我不明白为什么它作为一个控制台应用程序,但不是由SharePoint运行时。 这是在同一台计算机上使用相同的用户帐户...

这是用于调用DLL的代码:

 [DllImport("idDll.dll", EntryPoint = "GetMachineId", SetLastError = true)]
    extern static string GetComponentId([MarshalAs(UnmanagedType.LPStr)]String s);

    public static string GetComponentId()
    {
        Debugger.Break();
        if (_machine == string.Empty)
        {
            string temp = "";
            id= ComponentId.GetComponentId(temp);
        }
        return id;
    }

可能与安全性有关:重要的一点是它可以在控制台应用程序中运行。

在控制台应用程序中,RunWithElevatedPrivileges不起作用,因为它会模拟您的工作进程的应用程序池用户,该用户对该框本身没有特殊权限。

相比之下,控制台应用程序在登录用户的上下文中运行。

试着模拟一个拥有权限的用户,比如当你运行这里指定的控制台应用程序时(使用撤销()内部try / finally记住你!)。 获取令牌时,您可以创建一个SPUserToken并使用SPSite构造函数建立站点上下文,该构造函数接受一个GUID和一个SPUserToken

在这里举几个例子来说明这种方法。

编辑:哦,它的工作在2003年的原因可能是您的应用程序池帐户有太多权利;-)


为什么不使用WMI来获取硬盘的序列号,从而避免执行非托管代码。 请参阅此示例如何检索REAL硬盘序列号


这种非确定性的崩溃行为通常伴随着内存覆盖/损坏; 有时它很重要(崩溃),有时候你很幸运。

您可能需要检查获取故障转储并使用WindDbg进行分析。 既然你有源代码,你可以用各种堆栈重新构建它,启用堆内存保护和警告系统(取决于你的编译器),并看看你得到了什么。

链接地址: http://www.djcxy.com/p/7737.html

上一篇: SharePoint fails to load a C++ DLL on Windows 2008

下一篇: Vista DLLImport Problem C#