Я пытался скомпилировать код C ++ в C # с использованием CodeDomProvider, но программа выдает ошибки. Я не знаю точно, как использовать CppClassProvider. Не могу найти в Интернете никаких справочных материалов, касающихся CppCodeProvider, все сайты имеют примеры CSharpCodeProvider или CodeDomProvder. Я буду благодарен, если кто-нибудь может помочь мне с ситуацией.
Если я иду в неправильном направлении, я хочу объяснить, что меня интересует компиляция кода C ++ в моем приложении C # и сборка «.exe», как это делает CSharpCodeProvider для кода «C #».
Кодекс, который я пытался реализовать, приведен ниже. Код написан плохо, пожалуйста, игнорируйте GPP (Good Programming Practices), так как я только что делал это, чтобы попробовать в настоящее время.
namespace CPPCodeProviderTest
{
class Program
{
static void Main(string[] args)
{
CompilerParameters cparams = new CompilerParameters();
cparams.GenerateExecutable = true;
String output = @"F:\test.exe";
cparams.OutputAssembly = output;
cparams.CompilerOptions = "/optimize";
//CppCodeProvider cpp = new CppCodeProvider();
CodeDomProvider pro = CodeDomProvider.CreateProvider("cpp");
cparams.ReferencedAssemblies.Add("System.dll");
String f = Properties.Resources.code;
CompilerResults cr = pro.CompileAssemblyFromSource(cparams, f);
if (cr.Errors.Count > 0)
{
foreach (CompilerError e in cr.Errors)
{
Console.WriteLine(e.ErrorNumber + " " + e.ErrorText);
}
}
else
Console.WriteLine("successfull");
}
}
}
Resources.code
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!";
return 0;
}
Ошибка:
System.NotImplementedException was unhandled
HResult=-2147467263
Message=The method or operation is not implemented.
Source=CppCodeProvider
StackTrace:
at Microsoft.VisualC.CppCodeProvider.CreateCompiler()
at System.CodeDom.Compiler.CodeDomProvider.CreateCompilerHelper()
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources)
at CPPCodeProviderTest.Program.Main(String[] args) in c:\Users\SSV\Documents\Visual Studio 2013\Projects\CPPCodeProviderTest\CPPCodeProviderTest\Program.cs:line 25
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Спасибо 🙂
Этот метод Microsoft.VisualC.CppCodeProvider.CreateCompiler
бросает исключение System.NotImplementedException
,
Это выдается, когда объект реализует интерфейс, но не все методы реализованы. Обычно это происходит, когда задокументировано, что метод может быть не реализован.
Документация здесь:
Это говорит:
Этот метод устарел в .NET Framework 2.0. Рекомендуемый
альтернативой является вызов методов ICodeCompiler, которые напрямую
доступно в коде провайдера.Примечания для наследников В .NET Framework 2.0 вы должны реализовать
члены ICodeCompiler в классе CodeDomProvider и бросить
NotSupportedException, когда этот метод вызывается.
После долгого копания я обнаружил, что Компиляция CPP не поддерживается Microsoft в настоящее время. Вы можете использовать любой компилятор C ++, который поддерживает командную строку (gcc, Mingw и т. Д.), Для компиляции кода на C ++.
Странная вещь, когда вы проверяете следующий код, он возвращает true, но метод не реализован Microsoft.
CodeDomProvider.IsDefinedLanguage("Cpp")
Если кто-то обнаружит, что я ошибаюсь, или найдет лучший способ сделать это, пожалуйста, дайте мне знать.
Спасибо 🙂