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

Nat*_*ath 5 c# c++ sharepoint dllimport

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

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

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

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

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

"step in: Stepping over non user code"
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用Visual Studio调试DLL.

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

SPSecurity.RunWithElevatedPrivileges(delegate()
Run Code Online (Sandbox Code Playgroud)

但这也无济于事.

我有这个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;
    }
Run Code Online (Sandbox Code Playgroud)

And*_*ask 3

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

在控制台应用程序中,RunWithElevatedPrivileges 没有任何效果,因为它模拟工作进程的应用程序池用户,该用户对该框本身没有特殊权限

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

尝试模拟具有权限的用户,例如运行此处指定的控制台应用程序时(请注意,在 try/finally 中使用 Undo()!)。获取令牌时,您可以创建 SPUserToken 并使用采用GUID 和 SPUserToken 的 SPSite 构造函数建立站点上下文

有几个例子记录了这种方法,例如这里。

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