问题: 我有一个表单项目,它实例化一个在单独的 dll 项目中定义的类。当运行使用此 dll 的表单应用程序时,一切运行正常,但是,当我设置断点来检查 dll 项目中定义的类型的对象时,我的监视窗口中出现错误。
了解一些可能很重要的事情:
- dll 项目使用不安全和非托管代码。
- 在调用任何不安全的函数之前会出现此问题。
- 非托管代码调试已启用。
- 我知道符号是为 dll 加载的。
- 我知道调试器加载的 dll 版本与应用程序使用的版本相同。
- 我已经清理并删除了输出目录,然后重建。
- 他们使用相同的 .NET 版本。
示例:如果我要将它添加到我的监视窗口MyDllType.SomeProperty
中,我会看到这个(仅在监视窗口中):
'MyDllType.SomeProperty' threw an exception of type 'System.ArgumentException' Message: "Cannot find the method on the object instance."
但是,如果我要Debug.Writeline(MyDllType.SomeProperty);
在同一确切点添加,那么我不会有任何异常,并且它会正确显示在输出控制台中。
此外:如果我要创建一个在 dll 项目中定义的结构类型的列表并将其添加到我的监视窗口中,我会看到这个(仅在监视窗口中):
// My Dll Project
public struct MyDllStruct
{
public int x;
public int y;
public int z;
}
// Snippet from a function block in forms project
List<MyDllStruct> structList = new List<MyDllStruct>();
// Add a bunch of stuff to the list
// <-- Insert a breakpoint here
}
当我打破并添加structList
到监视窗口时,我得到:
Unable to evaluate the expression. Operation not supported. Unknown error: 0x8004f0ed.
但是,我再次Debug.Writeline(structList.Count);
在同一点添加,然后我不会有任何异常,并且计数将正确显示在输出控制台中。
完整示例:
// My Dll Project
public class MyDllType
{
public MyDLLType()
{
this.someProperty = 123456;
}
private int someProperty;
public int SomeProperty
{
get{ return this.someProperty; }
set{ this.someProperty = value; }
}
}
public struct MyDllStruct
{
public int x;
public int y;
public int z;
}
// My Forms Project
public class SomeController
{
public SomeController()
{
this.dllType = new DllType();
List<MyDllStruct> structList = new List<MyDllStruct>();
// <-- For example, I get both aformentioned problems if i break here (or anywhere else these objects have been instantiated)
}
private MyDllType dllType;
}
正如您可能想象的那样,这使得调试我的应用程序变得非常困难:) 任何帮助将不胜感激。