| Code: |
|
#include "servotalk.hpp" #include <cassert> using namespace servotalk; namespace Lame { public ref class LameWindow : public Form { public: virtual void cheese() { MessageBox::Show("cheese"); } }; } Object^ deserialize_object_from_codedomprovider_stream(CodeDomProvider^ provider,Stream^ stream,StringWriter^ errorStream) { assert(provider!=nullptr); assert(stream!=nullptr); CompilerParameters^ params=gcnew CompilerParameters(); params->ReferencedAssemblies->Add("System.dll"); params->ReferencedAssemblies->Add("System.Windows.Forms.dll"); params->ReferencedAssemblies->Add("servotalk_debug.exe"); params->GenerateInMemory=false; StreamReader sr(stream); String^ source=sr.ReadToEnd(); //MessageBox::Show(source); CompilerResults^ compilation=provider->CompileAssemblyFromSource(params,source); if(compilation->Errors->HasErrors) { String^ errorStr=gcnew String(""); errorStr+=compilation->Errors->Count.ToString() + " Errors:"; for (int x=0;x<compilation->Errors->Count;x++) { errorStr+= "\r\nLine: " + compilation->Errors[x]->Line.ToString() + " - " + compilation->Errors[x]->ErrorText; } MessageBox::Show(errorStr); if(errorStream!=nullptr) { errorStream->Write(errorStr); } return nullptr; } return compilation->CompiledAssembly->CreateInstance("MyNamespace.MyClass"); } [STAThreadAttribute] int main(array<System::String ^> ^args) { String^ sourceStr = " \ using System; \ using System.IO; \ using System.Windows.Forms; \ namespace MyNamespace \ { \ public class MyClass : Lame.LameWindow \ { \ public override void cheese() \ { \ MessageBox.Show(\"Cheese Donkey\"); \ } \ } \ } \ "; MemoryStream sourceMS; StreamWriter sourceSW(%sourceMS); sourceSW.Write(sourceStr); sourceSW.Flush(); sourceMS.Flush(); sourceMS.Position=0; Object^ obj=deserialize_object_from_codedomprovider_stream(gcnew CSharpCodeProvider(),%sourceMS,nullptr); Lame::LameWindow^ window=dynamic_cast<Lame::LameWindow^>(obj); window->cheese(); window->Show(); while(window->Created) { Application::DoEvents(); } return 0; } |