从非托管代码进入CLR的线程中的未处理异常不会触发"正常"未处理异常CLR处理.
在下面的代码CSSimpleObject.GetstringLength()中用C++ 调用
在"1"的情况下
在"2"(预期行为)的情况下
要做出"正常"行为需要做些什么?
下面的代码基于" 所有互操作和融合样本 "中的Visual Studio 2010" CppHostCLR "代码示例.
RuntimeHost(C++):
PCWSTR pszStaticMethodName = L"GetStringLength";
PCWSTR pszStringArg = L"1";
//PCWSTR pszStringArg = L"2";
hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath,
pszClassName, pszStaticMethodName, pszStringArg, &dwLengthRet);
if (FAILED(hr))
{
wprintf(L"Failed to call GetStringLength w/hr 0x%08lx\n", hr);
goto Cleanup;
}
Run Code Online (Sandbox Code Playgroud)
托管代码(C#):
public class CSSimpleObject
{
public CSSimpleObject()
{
}
//------8<----------
public static int GetStringLength(string str)
{
AppDomain.CurrentDomain.UnhandledException += new …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个可以加载托管插件的插件系统.如果有任何异常,主机应该能够卸载插件.对于我的poc,我在C#中有一个示例代码库,它会抛出这样的异常......
public static int StartUp(string arguments)
{
Console.WriteLine("Started exception thrower with args {0}", arguments);
Thread workerThread = new Thread(() =>
{
Console.WriteLine("Starting a thread, doing some important work");
Thread.Sleep(1000);
throw new ApplicationException();
}
);
workerThread.Start();
workerThread.Join();
Console.WriteLine("this should never print");
return 11;
}
Run Code Online (Sandbox Code Playgroud)
然后我有这样的原生win32控制台应用程序..
int _tmain(int argc, _TCHAR* argv[])
{
ICLRMetaHost *pMetaHost = NULL;
HRESULT hr;
ICLRRuntimeInfo *runtimeInfo = NULL;
__try
{
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
hr = pMetaHost->GetRuntime(L"v4.0.30319",IID_ICLRRuntimeInfo,(LPVOID*)&runtimeInfo);
ICLRRuntimeHost *runtimeHost = NULL;
hr = runtimeInfo->GetInterface(CLSID_CLRRuntimeHost,IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost);
ICLRControl* clrControl …Run Code Online (Sandbox Code Playgroud) Excel VSTO如何工作?如果我在Visual Studio 2005中创建Excel工作簿解决方案,那么我可以愉快地编写代码,完全访问Excel对象模型,甚至将Excel工作表视为设计图面.当我构建解决方案时,我得到一个.XLS文件和一个.DLL(包含我的C#代码).
我现在可以通过双击来启动Excel工作表,.XLS并且我的工作表上有我所有的C#代码和我在工作表上删除的任何控件等.
表格如何引用.DLL?excel工作簿/表的哪一部分告诉它需要启动CLR并托管我的程序集?
我的项目引用了Library1.dll和Library2.dll. Library2.dll依赖于Library1.dll,但它被编译为通过另一个名称Library1.Net40.dll引用它.
是否有一种很好的方式告诉我的应用程序重定向Library1.Net40.dll的所有引用以解析为Library1.dll?也许类似于使用<bindingRedirect>重定向版本的方式?
我有一个处理AppDomain.AssemblyResolve事件的解决方案,但它有点像黑客,我希望有更好的方法来做到这一点.
编辑:对于任何人的参考,这是我最终使用AppDomain.AssemblyResolve事件解决它以重定向到不同的程序集.
我需要在非托管进程中托管.NET运行时.我有通过COM加载运行时的代码,我可以将程序集加载到AppDomain并执行代码就好了.
但是,我遇到了托管在网络共享上的应用程序的问题,并且必须更改应用程序策略才能让它们执行而不是一个选项.所以我想要做的是将运行时的主AppDomain的权限级别设置为不受限制.
有人可以举例说明如何设置AppDomain策略级别吗?我无法弄清楚如何从非托管代码实例化所需的类来创建PolicyLevel和相关对象并设置策略.基本上我不知道我需要从我使用的C++代码中使用什么包含/命名空间引用.
这是我此时的代码:
/// Starts up the CLR and creates a Default AppDomain
DWORD WINAPI ClrLoad(char *ErrorMessage, DWORD *dwErrorSize)
{
if (spDefAppDomain)
return 1;
//Retrieve a pointer to the ICorRuntimeHost interface
HRESULT hr = CorBindToRuntimeEx(
ClrVersion, //Retrieve latest version by default
L"wks", //Request a WorkStation build of the CLR
STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN | STARTUP_CONCURRENT_GC,
CLSID_CorRuntimeHost,
IID_ICorRuntimeHost,
(void**)&spRuntimeHost
);
if (FAILED(hr))
{
*dwErrorSize = SetError(hr,ErrorMessage);
return hr;
}
//Start the CLR
hr = spRuntimeHost->Start();
if (FAILED(hr))
return hr;
CComPtr<IUnknown> pUnk;
//Retrieve the …Run Code Online (Sandbox Code Playgroud) 我正在尝试转换mscorlib.tlb.它通常在C++中使用,如下所示:
#import "mscorlib.tlb" raw_interfaces_only \
high_property_prefixes("_get","_put","_putref") \
rename("ReportEvent", "InteropServices_ReportEvent")
Run Code Online (Sandbox Code Playgroud)
如何将其转换为标题和实现文件?
我能够使用Visual Studio编译包含上面行的虚拟cpp文件,并生成一个.tlh文件.不应该有实施文件吗?
我需要一个C++程序,加载CLR并在C#库中调用一个函数.我需要调用的函数将COM接口作为参数.
我的问题是,CLR托管接口似乎只允许您使用此签名调用方法:
int Foo(String arg)
Run Code Online (Sandbox Code Playgroud)
例如,这个C++代码加载CLR并在"test.exe"中运行P.Test函数:
ICLRRuntimeHost *pClrHost = NULL;
HRESULT hrCorBind = CorBindToRuntimeEx(NULL, L"wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pClrHost);
HRESULT hrStart = pClrHost->Start();
DWORD retVal;
HRESULT hrExecute = pClrHost->ExecuteInDefaultAppDomain(L"C:\\Test.exe", L"P", L"Test", L"", &retVal);
Run Code Online (Sandbox Code Playgroud)
我需要做的是用这个方法签名调用一个函数(注意我拥有C#代码,所以我可以改变它):
void SomeFunction(IFoo interface)
Run Code Online (Sandbox Code Playgroud)
其中IFoo是一个com接口.如果我可以调用这样的函数,我甚至可以做我需要的东西:
IntPtr SomeFunction();
Run Code Online (Sandbox Code Playgroud)
我可以让SomeFunction构造一个正确的委托,然后使用Marshal.GetFunctionPointerForDelegate.但是,我无法弄清楚除了使用int func(string)签名调用函数之外,如何使托管接口执行任何操作.
有谁知道如何从具有不同签名的C++代码调用C#函数?
(注意我不能使用C++/CLI.我需要使用托管API.)
由于Microsoft文档声明运行时主机 .NET具有多个运行时主机以支持和执行我们的应用程序的代码,我的问题是如何知道Microsoft运行时主机的哪些运行时主机托管我的代码.
我正在使用C#语言开发可由各种运行时主机使用和/或托管的dll类库,因此我需要知道哪个运行时主机现在托管我的代码以满足指定条件.
我能找到的每个例子都是用C++编写的,但是我试图将我的项目保存在C中.是否有可能在C程序中托管CLR?
如果是这样,你能指点我一个例子吗?