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)
这可能与安全相关:重要的一点是它可以在控制台应用程序中运行。
在控制台应用程序中,RunWithElevatedPrivileges 没有任何效果,因为它模拟工作进程的应用程序池用户,该用户对该框本身没有特殊权限。
相比之下,控制台应用程序在登录用户的上下文中运行。
尝试模拟具有权限的用户,例如运行此处指定的控制台应用程序时(请注意,在 try/finally 中使用 Undo()!)。获取令牌时,您可以创建 SPUserToken 并使用采用GUID 和 SPUserToken 的 SPSite 构造函数建立站点上下文
有几个例子记录了这种方法,例如这里。
编辑:哦,它在 2003 年起作用的原因可能是您的应用程序池帐户拥有太多权限;-)
| 归档时间: |
|
| 查看次数: |
942 次 |
| 最近记录: |