从非托管代码进入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;
}
托管代码(C#):
public class CSSimpleObject
{
    public CSSimpleObject()
    {
    }
    //------8<----------
    public static int GetStringLength(string str)
    {
        AppDomain.CurrentDomain.UnhandledException += new …我正在尝试编写一个可以加载托管插件的插件系统.如果有任何异常,主机应该能够卸载插件.对于我的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;
    }
然后我有这样的原生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 …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 …我正在尝试转换mscorlib.tlb.它通常在C++中使用,如下所示:
#import "mscorlib.tlb" raw_interfaces_only              \
     high_property_prefixes("_get","_put","_putref")        \
     rename("ReportEvent", "InteropServices_ReportEvent")
如何将其转换为标题和实现文件?
我能够使用Visual Studio编译包含上面行的虚拟cpp文件,并生成一个.tlh文件.不应该有实施文件吗?
我需要一个C++程序,加载CLR并在C#库中调用一个函数.我需要调用的函数将COM接口作为参数.
我的问题是,CLR托管接口似乎只允许您使用此签名调用方法:
int Foo(String arg)
例如,这个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);
我需要做的是用这个方法签名调用一个函数(注意我拥有C#代码,所以我可以改变它):
void SomeFunction(IFoo interface)
其中IFoo是一个com接口.如果我可以调用这样的函数,我甚至可以做我需要的东西:
IntPtr SomeFunction();
我可以让SomeFunction构造一个正确的委托,然后使用Marshal.GetFunctionPointerForDelegate.但是,我无法弄清楚除了使用int func(string)签名调用函数之外,如何使托管接口执行任何操作.
有谁知道如何从具有不同签名的C++代码调用C#函数?
(注意我不能使用C++/CLI.我需要使用托管API.)
由于Microsoft文档声明运行时主机 .NET具有多个运行时主机以支持和执行我们的应用程序的代码,我的问题是如何知道Microsoft运行时主机的哪些运行时主机托管我的代码.
我正在使用C#语言开发可由各种运行时主机使用和/或托管的dll类库,因此我需要知道哪个运行时主机现在托管我的代码以满足指定条件.
我能找到的每个例子都是用C++编写的,但是我试图将我的项目保存在C中.是否有可能在C程序中托管CLR?
如果是这样,你能指点我一个例子吗?