111,132
社区成员
发帖
与我相关
我的任务
分享

public class FortranClass
{
[DllImport("OVERLEN.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern void OVERLEN(ref float vlaue);
[HandleProcessCorruptedStateExceptions()]
[SecurityCritical]
public static void overLenTest()
{
try
{
float[] value = new[] { 1f, 2f, 9f, 8f, 2f };
OVERLEN(ref value[0]);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
调用:
private void Test()
{
try
{
Assembly t = Assembly.Load("FortranLib");
Type a = t.GetType("FortranLib.FortranClass");
object obj = Activator.CreateInstance(a);
MethodInfo mi = a.GetMethod("overLenTest");
mi.Invoke(obj,null);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
结果还是会弹出那个错误弹框,关闭弹框后主程序就死啦[/quote]
把你这段代码封成一个类库 然后再给主程序调用
而不是在主程序写这段代码 public class FortranClass
{
[DllImport("OVERLEN.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern void OVERLEN(ref float vlaue);
[HandleProcessCorruptedStateExceptions()]
[SecurityCritical]
public static void overLenTest()
{
try
{
float[] value = new[] { 1f, 2f, 9f, 8f, 2f };
OVERLEN(ref value[0]);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
调用:
private void Test()
{
try
{
Assembly t = Assembly.Load("FortranLib");
Type a = t.GetType("FortranLib.FortranClass");
object obj = Activator.CreateInstance(a);
MethodInfo mi = a.GetMethod("overLenTest");
mi.Invoke(obj,null);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
结果还是会弹出那个错误弹框,关闭弹框后主程序就死啦
只有使用子进程啦[/quote]
你怎么反射的 加try 然后每调一次反射加载一次 用完卸载
只有使用子进程啦
下面这个是百度云盘的链接,
链接: https://pan.baidu.com/s/1ENYO-Gxs7xvyvpfZ26JDgQ 提取码: q989
我使用你说的方法进行测试并不能捕捉到异常。程序还是直接退出了,能否帮忙看下。对了若是要进行类库调用的话,需要将项目生成平台调至x86
这是我调用的方法 [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute()]
static void Main(string[] args)
{
try
{
float[] s = new[] {1f, 3f, 4f, 2f, 3f};
OVERLEN(ref s[0]);
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.WriteLine("OK");
Console.ReadLine();
}
[DllImport("OVERLEN.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern void OVERLEN(ref float vlaue);