Currently I have a console application, which is fine for me, but not for others. I need to create a GUI. I am developing for Windows 7 using Visual Studio 2010 and CUDA 3.2 build customizations.
Can I simply create a GUI in Windows Forms / WPF and then just state an extern "C" function, that will be resolved to a function calling a CUDA kernel? I tried to do so just now and I had a lot of compilation errors, including some CLR stuff. After a quick googling I have the impression, that it isn't as simple as it seemed.
-- edit
The generalized question is: how to include CUDA code in C++ Windows Forms / WPF application?
My partner and I had the same problem. We decided to write GUI in C# Windows Forms because of simplicity. However, we couldn't find any way of using CUDA in the same project (not even for Managed C++). There might be some way of doing it, but here is our solution: we created another project which was written in native c++ and produced dll file. Then, we used P/Invoke (Platform Invoke) in C# so, that we could call exported functions from dll. In the dll, there should be kernel and some device functions, but you should create another function which calls kernel and which will be exported. You can google P/Invoke and find out how to import native c++ functions from dll to c# application.
If you're using Visual Studio 2010, you can get started by downloading Cuda Toolkit v4.2 and then downloading CudaFy.net. A search for each on google will get you to the correct pages. Then you make sure nvcc is running. It is necessary to compile C# code into low level (cuda) code. You can then download sample apps to test how they work. You can start here
Related
I have created a vc++ windows form application (VS 2010) and when I tried to include ppl.h (Parallel Patterns Library) I got the following compile error.
Error: Concurrency Runtime is not supported when compiling /clr. c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concrt.h 27"
I want to use "parallel_for" algorithm in my program which is provided by 'VS 2010 Parallel Patterns Library'.
Can anyone tell me how to overcome the above problem and how to use 'Parallel Patterns Library' inside a windows forms application?
You appear to be writing a WinForms managed project in C++/CLI (why?...). In the managed world there is the the Task Parallel Library (TPL) and its System::Threading::Tasks::Parallel::For. You don't have to (can't) use PPL in a project targeting the clr, at least not in the managed part of it. Are you working on a mixed (managed/unmanaged) interoperability project? If so, separate managed and native parts properly. Then, use PPL inside native component and TPL inside managed components. Have a look at this blog entry, for example.
I finally was able to successfully install the Windows SDK tools (v.7.1) on my Windows Vista system. I already had the GCC compiler installed and that is what I currently use to compile C code.
Where do I find the documentation for the WinSDK and how should I go about including it in GCC?
I couldn't find any explanations in the release notes or anything. However, if you can find something that explains it, feel free to give me a link.
This might sound weird to you, but you didn't need to download any separate Windows SDK to develop for Windows, because Visual Studio, and MingW/GCC, and others, already commonly include all that most people would need. (Some people would say, that Visual Studio and other tools, ship with their own version of the SDK, but I think that's merely confusing the issue further.)
You need Visual Studio first. And maybe, some day later, you might want to add the Windows SDK add on to it, but it is not intended to be used by itself, or in combination with GCC.
Basically, some of the SDK content duplicates stuff that is already included in Visual C++ and Visual Studio and some of it is additional tools like WinDbg.
Let me explain. The Windows SDK is indeed, useful for doing certain things in Windows that beginners are unlikely to need to do. For example, if you need to integrate with some specialized APIs, the Windows SDK contains a lot of documentation, examples, and a more complete set of header files that weren't included in Visual Studio because they're less frequently used APIs. The core API headers and documentation for Windows are already in Visual Studio, so technically, Visual Studio already contains the core SDK, and the so called SDK is an "auxiliary SDK", or a "low level SDK for purists, advanced users, and certain kinds of systems or native-level programming", but not needed, for most typical end-user applications development.
But if you want to learn Win32 native programming using C or C++, or you just want to write native Windows applications you PROBABLY don't need anything that comes in the SDK, and even then you need Visual Studio first, and the SDK second. Let me explain:
Many tools that let you write pure native Windows applications, provide higher level APIs, including Visual Studio, which gives you MFC or ATL. None of those tools need the SDK to work. The SDK, so called, is more of a "extra crap that we don't ship with visual studio because hardly anybody needs it", which Microsoft abbreviated to SDK. I know. Weird.
You don't need the SDK at all if you intend to use GCC. If you want to write an application for Windows in bare C or bare C++, you can just install mingw if you insist on using gcc and working from the command line.
The normal way to write native applications is to use the free Microsoft Visual C++ Express edition, and you can use it to write either C or C++ apps, and it includes the header files and libraries you need to write almost any native windows application feature you need, without any need for the SDK. Visual Studio is a nice modern IDE, and lots of convenient cool features like code completion and so on. The SDK you downloaded doesn't contain any of that.
Anything you do need to know about the raw Win32 APIs you can learn using the Web format of the MSDN documentation, or the help in Visual Studio. The basic Windows APIs like WinCreateWindow, are documented already in the Visual Studio help and MSDN help, and you don't need the SDK docs for most of the core windows APIs.
If you're just getting started, can I suggest you should just go get the free (but not open source) Visual Studio 2010 Express. That's the recommended way to get started, not the SDK.
I'm quite sure that the Windows 7 SDK that you downloaded is not intended for use with GCC anyways, and if you need a version of windows header files that work with a Gnu C/C++ compiler, any basic Win32 APIs like GDI and the basic Windowing API stuff is already bundled in mingw version of gcc.
You might also want to know about the DDK, which is like the SDK but which is oriented towards Device Driver and native NT-mode development.
I have a C++/CLI library that I would like to use in a Silverlight application. It is supposed to be possible to write code for Silverlight in any .NET language, but so far I've only worked out how to compile C#. Silverlight does not seem to be able to use DLLs compiled for .NET.
I'm using Visual Studio 2010 and Silverlight 4. The only new projects available for Silverlight are C# projects. Porting the code to C# is not a practical option.
How do I compile C++/CLI code for Silverlight?
I think I may have gotten a VS2010 C++/CLI class library project to build with references to (only) Silverlight assemblies.
Update
Ok, it is possible. But it is not nice.
First, you must convince the C++ compiler to NOT load the .NET Framework, using an undocumented compiler switch. But that's not the worst part.
Set your C++/CLI project "Common Language Runtime Support" to /clr:safe
Next, under References, remove all references.
Next, in the C++/CLI project properties, under C++ > Command Line, enter /d1clr:nomscorlib /FU"C:\Program Files (x86)\Microsoft Silverlight\4.0.50917.0\mscorlib.dll"
Now, save the project and exit Visual Studio. Open the .vcxproj in a text editor, and change the framework version setting. You want it to be the same as a C# Silverlight project:
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
Now, reopen Visual Studio, and build the project. You'll get an error because the compiler auto-generated a file with #using<mscorlib> and the search path finds the .NET Framework version first.
Silverlight,Version=v4.0.AssemblyAttributes.cpp(1): fatal error C1197: cannot reference 'c:\windows\microsoft.net\framework\v4.0.30319\mscorlib.dll' as the program has already referenced 'c:\program files (x86)\microsoft silverlight\4.0.50917.0\mscorlib.dll'
Double-click the error to open the auto-generated file. Replace the path-less reference with e.g. (here's where you put your references, not in the project properties)
#using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\mscorlib.dll>
#using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\System.dll>
#using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\System.Core.dll>
Luckily, the compiler leaves your changes in-place. So you should be good as long as no one cleans your temp directory.
Building should now succeed.
Then, you need to go add the DLL created by the C++/CLI project to your Silverlight application. Note that you can't set up a project reference, because VS2010 still isn't convinced that the C++/CLI is a Silverlight project. So you'll have to browse and add the reference as an assembly file. (And it won't automatically switch between Debug and Release to match the Silverlight application).
Final Notes
I got it to run an empty Silverlight application in Debug mode and stop at a breakpoint in the middle of C++/CLI code. Also the C++/CLI code successfully returned a value to C# and the local variable in C# received the correct value. So I guess it's working.
I went through a bunch more steps trying to make this work, but I don't think they affected the outcome. If you run into errors, though, let me know and I'll try to figure out what I omitted from this answer.
Ben Voigt, thanks for this, it worked for me too.
Also, if your C++ code does anything that is specific to the C++ language (i.e. not entirely IL portable) like using stack semantics for an array, you'll get the following error:
could not find assembly 'Microsoft.VisualC.dll' etc.
If you recompile with the full .NET Framework and then dump the IL code, you'll find references to "''.$ArrayType$$$BY06$$CB_W modopt" or something similar. This tells you where to change the code.
I found that after I installed the Silverlight SDK and it got added to "\Program Files(x86)\Reference Assemblies" I did not have to go through all of Ben Voigt's steps, just changing the project file was enough.
Another note, you can also use:
<TargetFrameworkProfile>WindowsPhone71</TargetFrameworkProfile>
if you want to target Windows Phone (install the SDK first).
Silverlight does not support native C++ libraries, nor any P/Invoke scenarios due to security concerns. If your library is pure .Net you might be able to decompile it with ILDASM and recompile for Silverlight with ILASM.
Silverlight is not a powerful development platform like .NET which is tightly integrated with operating system. First of all silverlight is supposed to run on any operating system, so there is no choice of Native API anywhere in silverlight.
Silverlight also does not support MSIL completely, so there is lot of problem in compiling and recomiping it at IL level.
Can you say more about what kind of C++/CLI code you have? Most Rich internet applications (Silverlight's target) do not include any of high powerful computation, instead they are plain simple HTML+JS alternatives. For powerful graphics, you can use Silverlight's PixelShadder support.
Reflector
What you can do alternatively is,
Compile your C++/CLI to regular .NET DLL, use Reflector to disassemble and generate C# source code from your dll, it may not be perfect, but you will have most of your logic converted back in C#.
I was able Ben Voigt's solution to work with some minor changes in Visual Studio 2013
Here is what I did different.
Unload the silverlight project that you want to reference it in. Right click and choose edit project.csproj
Copy the Target Framework Settings. For me this was
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
<SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
For the compiler switch /d1clr:nomscorlib This was not working for me. Also a reference to mscorlib for silverlight was automatically added to the complied output without specifying it on the command line options. This is how I got around it.
Open the project in Just Deompile
Load the Assembly Editor Plugin
Navigate the tree to the references
Delete the reference to the non silverlight mscorlib from the reflexil menu.
Right click on the top level of the tree for the assembly, and save as under the reflexil menu.
I haven't tested all of the functions, but the ones I have tested so far worked as expected.
Thank you Ben, your post has saved me a lot of time. I was thinking I was going to have to port my library:)
I want to write an application for my Windows 6.1 standard smart phone that intercepts incoming SMS messages and auto responds if they match a specific criteria, but despite installing countless SDk's I am unable to do what I need.
The code I want to use relies on the Microsoft.WindowsMobile.PocketOutlook.dll assembly, but I can't seem to find that assembly. Is it possible to use this assembly on a standard mobile device, or do I have to have a Windows Mobile professional device?
So basically I need help getting set up to create Windows Mobile applications.
I am using SharpDevelop (because I
can't afford Visual Studio).
I need the
Microsoft.WindowsMobile.PocketOutlook
assembly (Since I have already written code that should work, that uses it).
A device emulator would also be nice
so I don't have to test on my phone.
Is what I want to do possible on a Windows 6.1 Standard device (HTC OZone)?
Any help would be appreciated, since I am completely stuck at this point.
Thanks,
I tried to compile my code and I get the following errors, as I suspected I would.
The type or namespace name
'WindowsMobile' does not exist in the
namespace 'Microsoft' (are you
missing an assembly reference?)
I can't find the Microsoft.WindowsMobile.PocketOutlook assembly so of course I'm missing an assembly reference.
Where can I get this assembly, and will this code run on my Windows 6.1 Standard phone if I can find it?
In my opinion it's very difficult for someone new to Windows Mobile development to work without Visual Studio.
In theory you can use SharpDevelop or MonoDevelop, but you wouldn't be able to do any debugging on the emulator or a connected device. Being able to debug by stepping through the code while it's running seems to me an unmissable thing if you're new to Windows Mobile and are not quite sure why something you coded is not working. It requires more effort and time to debug something and in the end you might find it more cost effective to buy a Visual Studio license.
The minimum required is Visual Studio 2005 Standard. You could try to see if you can find somewhere that sells it cheaply (as most developers now use VS2008/2010). If you're a student you could get an academic license or take advantage of Microsoft's DreamSpark program. Or if you're a startup you could look at Microsoft's BizSpark program.
Try starting with sample code that has most of you requirements implemented. The SDK comes with the sample: SMSIM
link text
It demonstrates how to use C# to write a managed code version of a Short Messaging Service (SMS) interception application.
I hope this helps.
Mike
I'm trying to disassemble a C/C++ DLL, and have made some progress, but I would like to create my own C DLL with the same function the original exports, and compare disassemblies.
Visual Studio adds to much crap, and when I remove the crap and build my project, the expected DLL is missing.
I need a lightweight, preferably IDE, tool to edit and build very simple C libraries.
Take a look at Code::Blocks
I need a lightweight, preferably IDE, tool to edit and build very simple C libraries.
I have found that one of the best ways to do integrated C-only Win32 development is using the freely available Lcc Win32 Compiler which comes with a built-in IDE, including resource editor.
In fact, it is really very lightweight and can be run from a USB stick with some manual tweaking.
It's indeed a really small download of just 6 mb and you can even download an optional Win32 API help file which is really useful while doing development.
The compiler also comes with a C tutorial, as well as good user documentation detailing how to use the integrated Win32 resource editor "wedit", there's also an advanced manual about more complex development tasks.
Dev-C++ is a nice and fast IDE which works well with MingW.
But it's all been asked and answered before ...
MinGW adds its own crap. Install your VC express properly and save yourself a lifetime of trouble.
Btw, you don't need to use Visual Studio for its compiler or vice versa. The oddity of missing a build dll is probably because you are not looking at the right path.
If you are building C DLLs you really would benefit from its command line toolset and utilities, sdks, easy config etc. MS lock-in proprietary extensions are widely used (in context of you trying to emulate another dll), and last thing you need is chasing cross compiler issues..
GCC + any text editor such as VIM is a very light alternative.
For Windows Development, all you need is inside MinGW
Edit: If you are in dire need of an IDE you can also use the MinGW tools from Eclipse with the CDT plugin. Although it adds weight to the solution because of the installation of Eclipse, this is what I really use to build my small DLLs (JNI wrappers in my case).
You can setup your small and direct makefiles or let Eclipse do it automatically for you and concentrate only on the source files (*.h, *.c).
The best part of using this approach instead other IDE is that you do not need Eclipse to further build the DLL, since the underlying project files generated are standard ones directly usable by integrated dev inside MinGW (or any Unix distro) such as make, configure, automake, and so on.
I'll second the vote for Code::Blocks, it's what I use (despite having VS 2008 installed as well). It is very simple and lightweight but has basically all the features you'd expect out of an IDE. It comes with several predefined project templates for all kinds of C and C++ development, including templates for DLLs.
Download the version that includes MinGW and you get a complete lightweight IDE ready to start compiling. You can also easily configure it to use the Visual Studio compiler instead of gcc if you prefer.
try Open Watcom. A cross-platform product, well-supported by the community, lets you develop in DOS, Windows, OS/2 etc for a lot of platforms. Version 1.8 was released recently. Has a light-weight IDE indeed