+ public static class SymbolWriter
+ {
+ public static bool HasSymbolWriter {
+ get { return symwriter != null; }
+ }
+
+ private static SymbolWriterImpl symwriter;
+
+ class SymbolWriterImpl : MonoSymbolWriter {
+ delegate int GetILOffsetFunc (ILGenerator ig);
+ delegate Guid GetGuidFunc (ModuleBuilder mb);
+
+ GetILOffsetFunc get_il_offset_func;
+ GetGuidFunc get_guid_func;
+
+ ModuleBuilder module_builder;
+
+ public SymbolWriterImpl (ModuleBuilder module_builder, string filename)
+ : base (filename)
+ {
+ this.module_builder = module_builder;
+ }
+
+ public int GetILOffset (ILGenerator ig)
+ {
+ return get_il_offset_func (ig);
+ }
+
+ public void WriteSymbolFile ()
+ {
+ Guid guid = get_guid_func (module_builder);
+ WriteSymbolFile (guid);
+ }
+
+ public bool Initialize ()
+ {
+ MethodInfo mi = typeof (ILGenerator).GetMethod (
+ "Mono_GetCurrentOffset",
+ BindingFlags.Static | BindingFlags.NonPublic);
+ if (mi == null)
+ return false;
+
+ get_il_offset_func = (GetILOffsetFunc) System.Delegate.CreateDelegate (
+ typeof (GetILOffsetFunc), mi);
+
+ mi = typeof (ModuleBuilder).GetMethod (
+ "Mono_GetGuid",
+ BindingFlags.Static | BindingFlags.NonPublic);
+ if (mi == null)
+ return false;
+
+ get_guid_func = (GetGuidFunc) System.Delegate.CreateDelegate (
+ typeof (GetGuidFunc), mi);
+
+ Location.DefineSymbolDocuments (this);
+
+ return true;
+ }
+ }